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

 

posted @ 2020-07-10 21:36  程序员三藏  阅读(838)  评论(0编辑  收藏  举报