springboot源码分析——自动配置流程
一:ConfigurationClassPostProcessor类的埋点
自动配置解析的核心功能都在这个类里面,这是一个BeanDefinitionRegistryPostProcessor的实现类,首先需要注册BeanDefinition,
然后实例化对象,最后调用,我们来循序渐进的跟进一下
1:注册ConfigurationClassPostProcessor的BeanDefinition对象

实例化这个类对调用到类的无参数构造方法:


无参数构造方法:



2:注册启动类的配置文件 ,TestSpringbootApplication






创建并注册BeanDefinition对象:
3:实例化ConfigurationClassPostProcessor对象并且调用
因为是BeanDefinitionRegistryPostProcessor接口的实现类,所以会在这个 方法实例化并调用哦





调用到类ConfigurationClassPostProcessor类中

二:自动配置整体流程分析
1:如果没有任何配置


2:加上@Configuration注解

会发现所有的解析动作都会空跑一遍
3:加上ComponentScan注解


进入解析:parse



这种解析的方法doProcessConfigurationClass:

解析ComponentScan组件:

这样@ComponentScan组件就解析完成了
4:加上@Import注解




注册Import,registerImport,注册后处理processConfigurationClass,递归处理Configuration注解的类




到这里Import类的解析完毕,包括递归解析


我们来简单的看一下自动配置如何解析
从这里开始:

获取Import注解:

搜集Import:

注册registrar对象:

注册deferImportSelector对象:



注册并且搜集Import信息逻辑:





这里又回到了最开始埋点时候的加载流程,会把所有的EnableAutoConfiguration 的key对应的values值返回
返回之后开始处理Configuration的逻辑

进入解析configuration注解的递归方法:

到这里在spring.factories中配置项都解析完成,而且会解析每一个EnableAutoConfiguration的values项,实现注册beanDefinition。
以JmxAutoConfiguration为例,分析一下注册流程
解析到configuration类中有@Bean注解,需要搜集@Bean方法信息,缓存到configClass中


解析配置类:


当spring容器启动的时候,会解析deferImportSelector,加载所有的spring.factories文件中的配置,过滤
递归解析configuration配置
总结:
自动配置的实现就是spring启动的时候,加载spring.factories的配置,解析每一个Configuration类,根据condition加载自动配置类,
根据condition条件实例化bean对象,然后维护到spring容器中。

浙公网安备 33010602011771号