Spring boot的自动配置是通过启动类上的注解实现的。
老生常谈了,如果看过类似的博文很容易定位。
小总结
启动类作为配置类会在Springboot启动过程中被ConfigurationClassParser解析,自动配置的实现其实就是通过AutoConfigurationPackage启动类上的两个@Import注解内的类实现
- AutoConfigurationImportSelector.class
- AutoConfigurationPackage.Registrar.class
这两个类都是@EnableAutoConfiguration中的,AutoConfigurationPackage主要保存类路径,自动配置的实现主要通过AutoConfigurationImportSelector来实现。
即
- ConfigurationClassParser解析配置类——启动类
- 解析并处理启动类上的@Import注解
对@Import注解不理解时可能会产生疑惑,Spring是如何处理识别并处理@EnableAutoConfiguration,其实并不会去专门识别该注解,在识别@Import注解的过程中会直接到每个注解中去寻找,就会找到@EnableAutoConfiguration中的两个@Import注解
Spring及Springboot配置元数据 @Import
入口:对@Import的解析——将自动配置的实现类AutoConfigurationImportSelector作为DeferredImportSelector收集起来
源码
ConfigurationClassParser解析启动类(配置类)
AutoConfigurationImportSelector
@EnableAutoConfiguration
之后通过对Spring boot启动类的注解解析,其中一个环节的解析就会去解析@Import注解,把这里的AutoConfigurationImportSelector收集起来,AutoConfigurationImportSelector属于DeferredImportSelector,会在ConfigurationClassParser的parse方法之后去解析
从DeferredImportSelectorHandler对DeferredImportSelector的处理跳转到AutoConfigurationImportSelector的处理
在这里开始自动配置的实现
DeferredImportSelectorHandler
为什么AutoConfigurationImportSelector要作为DeferredImportSelector来延迟加载,这也与自动配置的思想吻合,如果用户自己在解析配置类的过程中没有自己实现,那么就会在延迟加载中通过自动配置来实现加入默认的配置类,也就是使用默认约定。
AutoConfigurationImportSelector最终实现自动配置场景
最终跳到核心场景
AutoConfigurationImportSelector处理自动配置
拓展
starter原理——以mybatis为例
可以看出,starter包引入会包含autoconfigure包,它会封装SPI EnableAutoConfiguration接口的实现类来实现mybatis的自动配置导入。
根据我们上面知道,AutoConfigurationImportSelector可以从类路径中找到这个映射并导入。
druid-spring-boot-starter
原理都一样