spring源码解析
https://www.cnblogs.com/leeSmall/category/1348229.html
@EnableAutoConfiguration 是怎么被解析的, 什么时候被解析的, 谁来解析的
@EnableAutoConfiguration
各位是否还记得Spring框架提供的各种名字为@Enable开头的Annotation定义?比如@EnableScheduling,@EnableCaching,@EnableMBeanExport等,@EnableAutoConfiguration的理念和"做事方式"其实一脉相承,借助@Import的支持,收集和注册特定场景相关的bean定义:
@EnableScheduling是通过@Import将Spring调度框架相关的bean定义都加载到Ioc容器中。
@EnableMBeanExport是通过@Import将JMX相关的bean定义加载到Ioc容器
而@EnableAutoConfiguration也是借助@Import的帮助,将所有符合自动配置条件的bean定义加载到Ioc容器,仅此而已
其中,最关键的要属@Import(AutoConfigurationImportSelector.class),借助AutoConfigurationImportSelector这个类,@EnableAutoConfiguration可以帮助Springboot应用将所有符合条件的@configuration都加载到当前的SpringBoot创建并使用的Ioc容器
何时被执行
现在我们已经知道了在@EnableAutoConfiguration中引入了AutoConfigurationImportSelector类,那么它是如何被执行的呢?
Springboot启动时会使用ConfigurationClassParser来解析被@Configuration修饰的配置类,然后再处理这个类内部被其他注解修饰的情况,比如@Import注解,@ComponentScan注解,@Bean注解等。
如果发现注解中存在@Import(ImportSelector)的情况下,就会创建一个相应的importSelector对象,并调用其selectImports方法,而AutoConfigurationImportSelector就是一个ImportSelector的实现类。更多关于ConfigurationClassParser的分析,参阅文章:Spring类注册笔记
所以ConfigurationClassParser会实例化一个AutoConfigurationImportSelector 并调用它的 selectImports() 方法
在selectImports方法中有使用getCandidateConfigurations()这个方法,这个方法走进去,就可以看到自动配置的幕后英雄:SpringFactoriesLoader
自动配置的幕后英雄:SpringFactoriesLoader
SpringFactoriesLoader的主要功能就是从指定的配置文件META/spring.factories加载配置,spring.factories是一个典型的java properties文件,配置格式为Key-Value形式,只不过Key和Value都是Java类型的完整类名。
作者:pjmike_pj
链接:https://juejin.im/post/5b778945f265da436b524043
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
扫描用户指定包下的类,获取Resource或Resource集合
一个Resource实例代表一个类文件。
ResourceLoader
AntPathMatcher
PathMatchingResourcePatternResolver
ClassPathBeanDefinitionScanner
ComponentScanAnnotationParser
Parser for the @{@link ComponentScan} annotation.
ConfigurationClassParser
Springboot启动时会使用ConfigurationClassParser来解析被@Configuration修饰的配置类,然后再处理这个类内部被其他注解修饰的情况,比如@Import注解,@ComponentScan注解,@Bean注解等。
ConfigurationClassPostProcessor
- {@link BeanFactoryPostProcessor} used for bootstrapping processing of
- {@link Configuration @Configuration} classes.
ClassPathScanningCandidateComponentProvider
A component provider that provides candidate components from a base package.
MetadataReaderFactory
CandidateComponentsIndex
ConditionEvaluator
Internal class used to evaluate {@link Conditional} annotations.
获取所有注解@Componet的类
CandidateComponentsIndex
获取类的元数据
基于ASM ClassReader
MetadataReader
获取类的元数据信息: class文件、 class metadata, 类上的注解和方法上的注解。
ClassMetaData
AnnotationMetaData