学记:为spring boot写一个自动配置
spring boot遵循“约定优于配置”的原则,使用annotation对一些常规的配置项做默认配置,减少或不使用xml配置,让你的项目快速运行起来。spring boot的神奇不是借助代码的生成来实现的,而是通过条件注解来实现的。
自动配置AutoConfiguration是实现spring boot的重要原理,理解AutoConfiguration的运行原理特别重要,自己写一个AutoConfiguration可以加深我们对spring boot的理解。
1、定义Type-safe Configuration Properties
@ConfigurationProperties("author")//1
public class AuthorPropertis {
private static final String NAME = "pyj";
private static final String PWD = "12324";
private String name = NAME;//2
private String pwd = PWD;
private String[] arrayProps;//3
private Properties properties = new Properties();//4
private List<Map<String, Object>> listProp1 = new ArrayList();//5
private List<String> listProp2 = new ArrayList();//6
private Map<String, Object> mapProps = new HashMap();//7
getter and setter...
}
1、@ConfigurationProperties映射application.yml以author为前缀的配置
2、author.name的默认值是pyj
3-7:对于容器对象的属性注入
2、定义一个简单的bean
public class HelloService {
private String msg;
getter and setter...
}
注意:不用纠结HelloService的内容,它就是一个简单的bean。
3、定义AutoConfiguration
@Configuration//1
@ConditionalOnClass(HelloService.class)//2
@EnableConfigurationProperties(AuthorPropertis.class)//3
@ConditionalOnProperty(prefix = "author",value = "enabled",matchIfMissing = true)//4
public class AuthorAutoConfiguration { private final AuthorPropertis authorPropertis; public AuthorAutoConfiguration(AuthorPropertis authorPropertis) {//5
this.authorPropertis = authorPropertis;
} @Bean//6
@ConditionalOnMissingBean(HelloService.class)//7
public HelloService helloService() throws JsonProcessingException {
HelloService helloService = new HelloService();
helloService.setMsg(authorPropertis.getName() +" :" + authorPropertis.getPwd()); ObjectMapper objectMapper = new ObjectMapper();
System.out.println("arrayProps: " + objectMapper.writeValueAsString(authorPropertis.getArrayProps()));
System.out.println("listProp1: " + objectMapper.writeValueAsString(authorPropertis.getListProp1()));
System.out.println("listProp2: " + objectMapper.writeValueAsString(authorPropertis.getListProp2()));
System.out.println("mapProps: " + objectMapper.writeValueAsString(authorPropertis.getMapProps()));
System.out.println("Props: " + objectMapper.writeValueAsString(authorPropertis.getProperties()));
return helloService;
}
}
1、@Configuration声明为一个配置类
2、@ConditionalOnClass表示HelloService在类路径下的时候调用
3、@EnableConfigurationProperties使用AuthorPropertis的配置
4、@ConditionalOnProperty指定的author是否有默认值
5、注入AuthorPropertis
6-7、当不存在HelloService的bean时候,新建一个HelloService的bean
4、在spring.factories注册
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.github.gin.springboot.config.AuthorAutoConfiguration
在resources新建META-INF目录,再新建spring.factories,注册上AuthorAutoConfiguration,让spring boot知道为你自动配置。
如果不明白这个的原理,可以看看@EnableAutoConfiguration通过@Import({EnableAutoConfigurationImportSelector.class})来读取spring.factories
5、配置文件application.yml
debug: true author:
name: pyj
pwd: 1234
properties:
reasonable: 'true'
returnPageInfo: 'true'
listProp1:
- name: abc
value: sgaw
- name: efg
value: sagsag
listProp2:
- config2Value1
- config2Vavlue2
mapProps:
reasonable: true
returnPageInfo: true
arrayProps: 1,2,3,4,5
6、测试
@RestController
public class TestController { @Autowired
HelloService helloService; @RequestMapping("/")
public String index(){
return "hello world!";
} @RequestMapping("/hello")
public String hello(){
return helloService.getMsg();
}
}
运行mvn spring-boot:run,如果看到结果,那么证明是没问题的


上面的AuthorPropertis 、HelloService 、AuthorAutoConfiguration 可以作为一个独立的starter pom为其他项目提供一个通用的服务。虽然spring boot覆盖了大部分的使用场景,但也不是全部都有,但我们也可以利用AutoConfiguration起到同样的效果。
实例代码地址:有爱自取
学记:为spring boot写一个自动配置的更多相关文章
- 安装使用Spring boot 写一个hello1
一.创建springboot 项目 二.进行代编写 1.连接数据库:application.properties里配置 spring.datasource.driverClassName=com.my ...
- Spring Boot之实现自动配置
GITHUB地址:https://github.com/zhangboqing/springboot-learning 一.Spring Boot自动配置原理 自动配置功能是由@SpringBootA ...
- 4、Spring Boot 2.x 自动配置原理
1.4 Spring Boot 自动配置原理 简介 spring boot自动配置功能可以根据不同情况来决定spring配置应该用哪个,不应该用哪个,举个例子: Spring的JdbcTemplate ...
- Spring Boot面试杀手锏————自动配置原理
转:https://blog.csdn.net/u014745069/article/details/83820511 引言不论在工作中,亦或是求职面试,Spring Boot已经成为我们必知必会的技 ...
- 学记:spring boot使用官网推荐以外的其他数据源druid
虽然spring boot提供了4种数据源的配置,但是如果要使用其他的数据源怎么办?例如,有人就是喜欢druid可以监控的强大功能,有些人项目的需要使用c3p0,那么,我们就没办法了吗?我们就要编程式 ...
- Spring Boot框架的自动配置
(图片来源于网络,侵删!!!) l @RestController 因为我们例子是写一个web应用,因此写的这个注解,这个注解相当于同时添加@Controller和@ResponseBody注解 l ...
- SpringBoot 源码解析 (五)----- Spring Boot的核心能力 - 自动配置源码解析
在上一篇博客中分析了springBoot启动流程,大体的轮廓只是冰山一角.今天就来看一下springBoot的亮点功能:自动化装配功能. 先从@SpringBootApplication开始.在启动流 ...
- 如何基于Spring Boot搭建一个完整的项目
前言 使用Spring Boot做后台项目开发也快半年了,由于之前有过基于Spring开发的项目经验,相比之下觉得Spring Boot就是天堂,开箱即用来形容是绝不为过的.在没有接触Spring B ...
- spring cloud教程之使用spring boot创建一个应用
<7天学会spring cloud>第一天,熟悉spring boot,并使用spring boot创建一个应用. Spring Boot是Spring团队推出的新框架,它所使用的核心技术 ...
随机推荐
- No.004:Median of Two Sorted Arrays
问题: There are two sorted arrays nums1 and nums2 of size m and n respectively.Find the median of the ...
- spider 配置文件参考
spider有一个配置文件spider.xml,为xml格式,spider.xml采用DTD进行管理,用于管理spider的所有特性.路由.高可用等. 配置文件支持三种不同的方式进行指定: 1. 通过 ...
- cookie存储对象信息
最近看到某公司某项目中用于保存多个城市信息到cookie中的方法,该方法的逻辑是按时间顺序记录最近访问过的三个城市的名字及id,逻辑包插入与含排重.插入与排重的代码如下: 1 2 3 4 5 6 7 ...
- transformjs污染了DOM?是你不了解它的强大
原文链接: https://github.com/AlloyTeam/AlloyTouch/wiki/Powerful-transformjs 写在前面 上星期在React微信群里,有小伙伴觉得tra ...
- 移动端报表JS开发示例
最近对移动端的报表开发颇有研究,细磨精算了好久,虽然到现在还是“囊中羞涩”,但决定还是先抛砖引玉,拿点小干货出来和大家分享. 研究的工具是比较有代表性的FineReport. 1. 移动端哪些地方支 ...
- Spring in Action 学习笔记三-AOP
面向切面的Spring 2015年10月9日 11:30 屏幕剪辑的捕获时间: 2015-10-9 14:30 屏幕剪辑的捕获时间: 2015-10-9 ...
- GridView 树形结构分组的功能
在“会飞的鱼”博客中看到GridView实现树形结构的代码,经过修改,添加了树形结构中的复选框功能,欢迎吐槽. 源地址:http://www.cnblogs.com/chhuic/archive/20 ...
- head/tail实现
只实现了head/tail的基本功能,默认显示十行及-n参数. 一.使用带缓冲的系统调用. write/read等系统调用是不带缓冲的,可以包装一层,使其带缓冲. t ...
- HTML5全屏(Fullscreen)API详细介绍
// 整个页面 onclick= launchFullScreen(document.documentElement); // 某个元素 launchFullScreen(document.get ...
- webdriver学习笔记
该篇文章记录本人在学习及使用webdriver做自动化测试时遇到的各种问题及解决方式,问题比较杂乱.问题的解决方式来源五花八门,如有疑问请随时指正一遍改正. 1.WebDriver入门 //webdr ...