Spring源码解析(三) 注册Bean处理器对象
前言
前面讲了 BeanFactoryPostProcessor
本文讲 BeanPostProcessor
,两种总给人一种很像的感觉,首先我们先总结一下两者的区别(可能不全,逐步补充)。
BeanFactoryPostProcessor | BeanPostProcessor | |
---|---|---|
角色 | Spring IOC 所管理的一个Bean | Spring IOC 所管理的一个Bean |
执行时间 | IOC容器启动的时候,准确来说是 refresh 时 |
每次 getBean 时都会调用 |
执行次数 | 有且只有一次 | 无数次 |
实现方式 | 实现 BeanFactoryPostProcessor 接口 |
实现 BeanPostProcessor 接口 |
排序 | 可排序 | 可排序 |
获取到的参数 | ConfigurableListableBeanFactory 也就是Spring 的核心BeanFactory |
Object ,执行 getBean 的对象 |
操作性 | Bean工厂的操作他都能执行,例如:可以获取 BeanDefinition 并修改;提前注入Bean对象(执行该步骤时,自定义的Bean都没有注入);等等等等 |
修改当前Bean的信息 |
本文主要介绍了 refresh
方法中的 registerBeanPostProcessors(beanFactory);
, 用于注册Bean的处理器对象。
⚠️ 只是注册,不执行。
抽象流程
其实和 BeanFactoryPostProcessor
的调用流程类似。
- 根据类型查询所有
BeanPostProcessor
的实现对象,得到一个数组 - 记录
BeanPostProcessor
的数量(会有一个+1的操作,因为要算上下面手动注册的BeanPostProcessorChecker
) - 手动注册
BeanPostProcessorChecker
- 准备一些容器,用于存放收集来的各种处理器
- 遍历
BeanPostProcessor
的实现对象数组- 如果
BeanPostProcessor
实现了PriorityOrdered
接口,获取Bean
对象并添加到priorityOrderedPostProcessors
列表(和后面的有所不同,这里添加到列表的是BeanPostProcessor
具体Bean
对象,其他都是字符串)- 如果获取到的
Bean
对象还实现了MergedBeanDefinitionPostProcessor
则添加到internalPostProcessors
列表
- 如果获取到的
- 如果没有实现
PriorityOrdered
接口,但是实现了Order
接口,添加到orderedPostProcessorNames
列表中 - 如果没有实现排序相关的接口,普通对象添加到
nonOrderedPostProcessorNames
列表中
- 如果
- 对
priorityOrderedPostProcessors
进行排序,并注册 - 遍历
orderedPostProcessorNames
列表- 根据
ppName
找到对应的BeanPostProcessor
实例对象 - 添加到
orderedPostProcessors
集合中 - 如果实现了
MergedBeanDefinitionPostProcessor
接口,那么则将ppName
对应的bean
实例添加到internalPostProcessors
中
- 根据
- 对
orderedPostProcessors
进行排序 - 注册实现了
Ordered
接口的BeanPostProcessor
实例添加到BeanFactory
中 - 遍历
nonOrderedPostProcessorNames
列表 - 根据
ppName
找到对应的BeanPostProcessor
实例对象 - 添加到
nonOrderedPostProcessors
列表 - 如果实现了
MergedBeanDefinitionPostProcessor
则添加到internalPostProcessors
列表 - 遍历
nonOrderedPostProcessors
列表进行注册 - 对
internalPostProcessors
列表进行排序,并遍历注册 - 最后注册
ApplicationListenerDetector
到BeanFactory
中
总结
整个流程类似于调用 BeanFactoryPostProcessor
,通过类型获取所有的Bean处理器对象。然后根据顺序进行注册。
顺序为:
- 实现了
PriorityOrdered
接口的处理器对象 - 实现了
Ordered
接口的处理器对象 - 没有实现排序的处理器对象
- 实现了
MergedBeanDefinitionPostProcessor
接口的处理器对象
- 本文标题:Spring源码解析(三) 注册Bean处理器对象
- 本文作者:SunRan
- 创建时间:2022-01-21 13:28:57
- 本文链接:https://lksun.cn/2022/01/21/Spring源码解析-三-注册Bean处理器/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
评论