学记:为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团队推出的新框架,它所使用的核心技术 ...
随机推荐
- ArcGIS中的标注和注记
在ArcMap中可以使用标注和注记来识别要素,选择标注或注记取决于你需要如何控制文本显示以及在ArcMap中如何存储文本. 1.标注只是临时显示相关数据或字段 2.标注用于长时间保存数据以及显示方式. ...
- arcgis 按面积分割, 按比例分割面积,按等份批量面积分割工具
arcgis 按面积分割, 按比例分割面积,按等份批量面积分割工具 视频下载:https://yunpan.cn/cvujkpKIqwccn 访问密码 e9f4
- iOS之由身份证号返回性别
该博文出自:http://www.cnblogs.com/yang-guang-girl/p/5683454.html - (void)viewDidLoad { [super viewDidLoad ...
- SDK接入(3)之iOS内支付(In-App Purchase)接入
SDK接入(3)之iOS内支付(In-App Purchase)接入 继整理了Android平台的SDK接入过程.再来分享下iOS平台的内支付(In-App Purchase)接入,作为笔者在游戏开发 ...
- Swift3 - String 字符串、Array 数组、Dictionary 字典的使用
Swift相关知识,本随笔为 字符串.数组.字典的简单使用,有理解.使用错误的地方望能指正. ///************************************************** ...
- Augularjs-起步
今年项目的需要,开始琢磨研究前端开发,由于之前项目已经用Angularjs了,就顺其而然的继续沿用. 在使用Angularjs之前,先要准备好工具:Nodejs.npm.git.bower.fis 下 ...
- 一步步学习 Spring Data 系列之JPA(一)
引入: Spring Data是SpringSource基金会下的一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得数据库的访问变得方便快捷,并支持map-reduce框架和云计算数据服 ...
- js实现发送验证码倒计时按钮
在写注册页面时,有时候需要发送注册邮件来获取验证码,但是为了防止多次重复发送邮件, 必须让按钮隔一段时间后才能再次使用. 代码如下: <html> <head> <met ...
- 在本机搭建SVN服务器
目的:在没有正式的SVN服务器的情况下,完成代码的本地备份. 参考:http://blog.csdn.net/ladofwind/article/details/2100200 以下是具体内容: 如何 ...
- Oracle数据库的 增、删、改、查
有时候数据库的查询语句一时想不起来,或不确定是不是语句写的正确,现在整理了一下标准的基本查询语句,便于以后牢记: .数据操作语言 DML:添加(insert into).修改(update set ...