Spring源码解析(三) 注册Bean处理器对象
SunRan

前言

前面讲了 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的调用流程类似。

  1. 根据类型查询所有 BeanPostProcessor的实现对象,得到一个数组
  2. 记录 BeanPostProcessor的数量(会有一个+1的操作,因为要算上下面手动注册的 BeanPostProcessorChecker
  3. 手动注册 BeanPostProcessorChecker
  4. 准备一些容器,用于存放收集来的各种处理器
  5. 遍历 BeanPostProcessor的实现对象数组
    1. 如果 BeanPostProcessor实现了 PriorityOrdered接口,获取 Bean对象并添加到 priorityOrderedPostProcessors列表(和后面的有所不同,这里添加到列表的是 BeanPostProcessor具体 Bean对象,其他都是字符串)
      1. 如果获取到的 Bean对象还实现了 MergedBeanDefinitionPostProcessor则添加到 internalPostProcessors列表
    2. 如果没有实现 PriorityOrdered接口,但是实现了 Order接口,添加到 orderedPostProcessorNames列表中
    3. 如果没有实现排序相关的接口,普通对象添加到 nonOrderedPostProcessorNames列表中
  6. priorityOrderedPostProcessors 进行排序,并注册
  7. 遍历 orderedPostProcessorNames列表
    1. 根据 ppName找到对应的 BeanPostProcessor实例对象
    2. 添加到 orderedPostProcessors集合中
    3. 如果实现了 MergedBeanDefinitionPostProcessor接口,那么则将 ppName对应的 bean实例添加到 internalPostProcessors
  8. orderedPostProcessors进行排序
  9. 注册实现了 Ordered接口的 BeanPostProcessor实例添加到 BeanFactory
  10. 遍历 nonOrderedPostProcessorNames 列表
  11. 根据 ppName找到对应的 BeanPostProcessor实例对象
  12. 添加到 nonOrderedPostProcessors列表
  13. 如果实现了 MergedBeanDefinitionPostProcessor 则添加到 internalPostProcessors列表
  14. 遍历 nonOrderedPostProcessors列表进行注册
  15. internalPostProcessors 列表进行排序,并遍历注册
  16. 最后注册 ApplicationListenerDetectorBeanFactory

总结

整个流程类似于调用 BeanFactoryPostProcessor,通过类型获取所有的Bean处理器对象。然后根据顺序进行注册。

顺序为:

  1. 实现了 PriorityOrdered接口的处理器对象
  2. 实现了 Ordered接口的处理器对象
  3. 没有实现排序的处理器对象
  4. 实现了 MergedBeanDefinitionPostProcessor接口的处理器对象
  • 本文标题:Spring源码解析(三) 注册Bean处理器对象
  • 本文作者:SunRan
  • 创建时间:2022-01-21 13:28:57
  • 本文链接:https://lksun.cn/2022/01/21/Spring源码解析-三-注册Bean处理器/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论