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 许可协议。转载请注明出处!
 
         评论