Springboot——自动配置原理( 二 )

这样看发现我们的启动类实际是被这些注解标识:
@Configuration
@Import(AutoConfigurationImportSelector.class)
@Import(AutoConfigurationPackages.Registrar.class)
@ComponentScan
我们按我们上面步骤的第三步来对TomcatWarApplication.class这个配置类进行解析:
1、@ComponentScan满足第三个条件,如果@ComponentScan注解没有显示设置的属性,那么就扫描TomcatWarApplication所在包路径(com.sourcecode.springboot.tomcatwar)下的class,如果满足条件(比如注解了@Configuration或@Service等)就会将这些class作为一个配置类,然后进行同样的解析
2、@Import(AutoConfigurationImportSelector.class),这个Selector是ImportSelector类型且是DeferredImportSelector类型,那么就将AutoConfigurationImportSelector中的selectImports方法返回的类作为配置类进行同样解析,该方法使用SPI的方式从jar中的META-INF/spring.factories文件中获取指定属性的值(也就是对应类的全路径名称为属性名),然后将这些类作为配置类进行同样的解析,一些starter的定义就是使用这种方式(比如Druid数据源的starter),如下所示:

Springboot——自动配置原理

文章插图
SPI

Springboot——自动配置原理

文章插图
自动配置

Springboot——自动配置原理

文章插图
druid数据源的starter
3、@Import(AutoConfigurationPackages.Registrar.class),该Registrar是ImportSelector类型但不是延迟导入类型,so调用该类的registerBeanDefinitions方法进行注册BeanDefinition,比如Mybatis的注解@MapperScan:
Springboot——自动配置原理

文章插图
@MapperScan注解
再来看@Import中的MapperScannerRegistrar,最终通过registerBeanDefinitions方法来对我们定义的Mapper/Dao进行扫描并注册BeanDefinition到BeanFactory中
Springboot——自动配置原理

文章插图
MapperScannerRegistrar
【Springboot——自动配置原理】通过对Springboot自动配置的的分析,我们就可以定义我们自己组件的starter了~~~
再次回顾下配置类的解析流程图吧:
Springboot——自动配置原理

文章插图
配置类解析流程图
觉得可以的话点个关注,加个收藏呗,陆续奉上干货~~~~




推荐阅读