写点什么

spring-beans 注册 Beans(三) ConfigurationClassPostProcessor 处理 BeanDefinition 流程

用户头像
梦倚栏杆
关注
发布于: 2021 年 06 月 06 日

先占个标题系列的坑,内容待更新。

一、整体执行概览:

已上总共提到 5 个类:

第一个是入口,总处理流程。

中间三个:处理类与类之间.(通过类上的注解引入新的类文件等)

最后一个类: 处理类内部:方法注解(比如 @Bean)


具体我们看详细的代码执行流程: 

1.入口:

2.处理 BeanDefinitions

2.1 获取需要处理的 Bean

此刻 candidateNames 获取到的有 9 个, 经过筛选当前需要处理的 beanName 只有一个 application.

debug 窗口显示的数据如下:

2.2 处理 ConfigCandidates


(1)parse.parse();===>扫描类上的注解,例如 componentScan. (第一个红色粗框,上方红色细框是赋值逻辑)

(2)reader.loadBeanDefinitions();===>处理类内部的注解,比如:方法上的 @Bean 注解(第二个红色加粗的框, 上方红色细框是赋值逻辑)

(3) check 经过已上两步, 查看 register 里是否引入新的需要处理的 ConfigCandidates.如果有,重复已上两个步骤

  1. 分析 ConfigurationClassParser.parse 执行流程

3.1 我们以处理 beanName=application 为例, 从前面的 debug 截图我们知道,该 definition 是 AnnotatedGenericBeanDefinition, 也就是 AnnotatedBeanDefinition。


3.2 继续往下:

3.3 支持继承类递归处理,首次该 bean 肯定不存在,exist 的流程先暂时忽略,看主流程.

3.4 处理的注解有:

(1) PropertySources/PropertySource==>加载对应资源配置到对应环境

(2) ComponentScans/ComponentScan===>ComponentScanAnnotationParser 处理生成相关的 BeanDefinition(如入口图片中间三个), 对每一个 definition 进行再次处理

(3)ImportResource===>设置到对应的 BeanDefinition 的 importResource(去除变量),并不处理该资源

(4)Bean===>只设置该 BeanDefinition 的 BeanMethods.不处理其他类

(5)SuperClass Bean=>同(4),但是处理的是父类的。

  1. 分析 ConfigurationClassBeanDefinitionReader.loadBeanDefinitions();

对于第三步里涉及到的资源没有处理为 bean,需要处理为 bean 的,进行 BeanDefinition 的定义和注册

4.1 入口:

4.2 处理对应的资源


registerBeanDefinitionForImportedConfigurationClass=====>@Import(a.class)loadBeanDefinitionsForBeanMethod====>@Bean注解类内容loadBeanDefinitionsFromImportedResources===> @Import(配置文件.xml)loadBeanDefinitionsFromRegistrars===>@Import(? extends ImportBeanDefinitionRegistrar.class)
复制代码


发布于: 2021 年 06 月 06 日阅读数: 21
用户头像

梦倚栏杆

关注

还未添加个人签名 2018.04.22 加入

还未添加个人简介

评论

发布
暂无评论
spring-beans 注册 Beans(三) ConfigurationClassPostProcessor处理BeanDefinition流程