一步步学习SpringBoot(二) @EnableAutoConfiguration
适应读者
- 前端工程师(java系的公司)
- 前端架构师(java系的公司)
- java工程师
- 测试工程师(java系的公司)
- 全栈工程师
回顾
上篇文章我们熟悉了SpringBoot的开发环境并且通过几行代码发布了一个web服务,相信大家已经对SpringBoot有了一个基本的了解,很多同学看了上篇文章私信我,大部分是惊讶SpringBoot简洁高效的同时又担心如果在公司使用它会有怎样的成本与风险,SpringBoot是 spring.io这几年推广的重点,而且现在流行的SpringCloud解决的是以SpringBoot单个服务应用为基础的多个微服务治理与整合的问题,SpringBoot在复用SpringMVC诸多特性的同时解决了SpringMVC配置繁琐的问题,所以熟悉SpringMVC的同学能快速地过渡到SpringBoot,而不熟悉SpringMVC的同学也可以直接跳过SpringMVC直接学习SpringBoot,本篇我们会给大家介绍SpringBoot的默认配置是怎么玩的。
先看看Main Class的注解@SpringBootApplication
细心的同学应该能记得main class的注解是@SpringBootApplication ,可以查下它的源代码
在这里我们可以看到
@SpringBootApplication 里面几个重要的注解 @EnableAutoConfiguration @ComponentScan
@EnableAutoConfiguration:
这个注解可以自动载入应用程序所需要的所有Bean,我们继续查看源代码
看到最重要的一个是@Import(EnableAutoConfigurationImportSelector.class),该类继承了AutoConfigurationImportSelector,仔细读了下AutoConfigurationImportSelector的源代码,
读到重点,我们会通过SpringFactoriesLoader去查询META-INF/spring.factories文件,spring应该通过spring.factories来初始化里面对应类,继续好奇,在github上很方便可以查到。https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories,部分截图如下:
在这里可以很清楚的看到@EnableAutoConfiguration其实是引入了spring.factories里面的所有配置,这些配置就是SpringBoot实现最亮点的地方:规约大于配置:这些配置的实现类大都定义了默认值,从而让开发同学只用去关心自己想配置的部分,这里我们再继续好奇下去选列表中的一个自动配置类RedisAutoConfiguration看下,从命名来看应该是redis的配置。
这里@EnableConfigurationProperties自动映射一个POJO到Spring Boot配置文件(默认是application.properties文件)的属性集,这个POJO就是RedisProperties.class,我们继续看下这个类做了什么事情,看看部分代码截图,
看到这里我们就懂了,这里面@ConfigurationProperties是将pojo的属性关联到前缀“spring.redis”, 这是比较好的开发方式,后续如果自定义的配置我们也可以效仿这种做法,整体将这个类映射到application.properties就会类似:
spring.redis.database =0,
spring.redis.port = 6379,
以上这些都是SpringBoot的默认配置, 如果我们想改成实际的配置,我们只用在resource/application.properties里面设置spring.redis.port =【新的端口】即可。
总结
我们通过了一系列的源码分析终于知道了@EnableAutoConfiguration是怎么运作的了,其实是这个注解去查询META-INF/spring.factories,这里面列出了所有的SpringBoot的默认配置,包含了server,dao,data,aop等等所有web应用需要用到的特性,并且将这些特性对应的pojo自动映射到application.properties上,在这次源码分析中我们不断了解了SpringBoot的自动配置运作原理,还从这些源代码学习到了很多的开发技巧,也许有些同学觉得源代码有些枯燥,但这是我向推荐大家的一种新技术学习方法,先学会怎么使用,再通过源代码来深入了解它的运作机制,这样既可以加深你对它的了解更能驾驭它,你也能在牛人的源代码里面学到很多开发技巧,也许有一天你也能开发一个框架贡献给千万开发者使用。
如想了解更多技术,请关注我的微信公众号。