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容器中。