spring-beans 注册 Beans(三) ConfigurationClassPostProcessor 处理 BeanDefinition 流程
先占个标题系列的坑,内容待更新。
一、整体执行概览:
已上总共提到 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.如果有,重复已上两个步骤
分析 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),但是处理的是父类的。
分析 ConfigurationClassBeanDefinitionReader.loadBeanDefinitions();
对于第三步里涉及到的资源没有处理为 bean,需要处理为 bean 的,进行 BeanDefinition 的定义和注册
4.1 入口:
4.2 处理对应的资源
版权声明: 本文为 InfoQ 作者【梦倚栏杆】的原创文章。
原文链接:【http://xie.infoq.cn/article/2e6126909fbc6c06bb9359b73】。未经作者许可,禁止转载。
评论