springboot源码解析

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

image.png

ClassPathBeanDefinitionScanner

image.png

ComponentScanAnnotationParser

Parser for the @{@link ComponentScan} annotation.

ConfigurationClassParser


image.png

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

image.png

获取类的元数据

基于ASM ClassReader

MetadataReader

获取类的元数据信息: class文件、 class metadata, 类上的注解和方法上的注解。

image.png

ClassMetaData


image.png

AnnotationMetaData

image.png
image.png

你可能感兴趣的:(springboot源码解析)