• 【Spring源码】8. 捋下invokeBeanFactoryPostProcessors()主要处理流程


    看下invokeBeanFactoryPostProcessors()函数的源码同学应该会发现这个方法跟之前文章中提过的getBean ()一样(它不是一个人在战斗)他有很多重载方法=_=,最终执行具体逻辑的方法中也有很多重复的部分,嘿嘿上篇还进行了相关的扩展,这篇文章我们来捋捋这个函数的流程(。・ω・。)ノ

    先通过refresh()函数进入到invokeBeanFactoryPostProcessors()中(如果不知道怎么进入refresh()函数,建议移步到【Spring源码】系列第一篇开始看哦(*¯︶¯*))

    ​然后进入这个方法,会发现里面有一个重载的方法,这个方法多了一个参数getBeanFactoryPostProcessors()

    这个参数的返回值是一个BeanFactoryPostProcessor的列表,里面是需要处理的BeanFactoryPostProcessor的外部集合

    我们进入PostProcessorRegistrationDelqegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());方法中

    开始捋》〉手把手那种(*≧ω≦)

    首先这个函数是处理BeanFactoryPostProcessors()的(详细的可以看上篇7),大致浏览下可以看到这个方法里有很多重复的功能块(感觉有点啰啰嗦嗦(_ _).。o○),但实际上,这个函数就做了两件事,一个是判断是否需要执行postProcessBeanDefinitionRegistry()方法(需要就执行),另一个是执行postProcessBeanFactory()方法。

    而之所以反反反复复复主要耽误在这个判断上,因为不是所有的PostProcessor都需要执行postProcessBeanDefinitionRegistry()方法。

    而我们的PostProcessor主要有三类来源,而invokeBeanFactoryPostProcessors()函数将这些需要加载的BeanFactoryPostProcessors分成三类来做处理,但实际上这三类都是判断是否需要执行这俩函数,即处理流程大同小异,所以看起来代码有些重复啰嗦。

    处理顺序

    1. 外部集合(getBeanFactoryPostProcessors()传入的参数)

    2. 子集(BeanDefinitionRegistryPostProcesssor)

    3. 父集(BeanFactoryPostProcessor)

    按上面的处理顺序可以将该函数的代码大致分为三部分:

    1. 处理外部集合

    ​for循环遍历入参的beanFactoryPostProcessors,由于并不知道传入的参数是继承了哪个PostProcessor,所以需要先进行PostProcessor的类型判断,然后分别放入不同的集合,

    判断是否为BeanDefinitionRegistryPostProcessor(子类)

    先判断是否为子类的原因

    • postProcessBeanDefinitionRegistry(registry)这个步骤是子类特有的,子类需要进行registryProcessor.postProcessBeanDefinitionRegistry(registry);的处理,而父类不用

    • 先执行子类独有的,子类父类都有的postProcessBeanFactory()在后面一起执行

    • 添加进不同的集合

    PS: 需要注意⚠️的是 BeanFactoryPostProcessor主要针对的操作对象BeanFactory;BeanDefinitionRegistryPostProcessor主要针对的操作对象是BeanDefinition

    2. 处理子类

    ​在处理子类的过程中,进行了优先级的判断: PriorityOrdered.class > Ordered.class > 其他 即根据上面的优先级对这些BeanDefinitionRegistryPostProcessor进行排序

    3. 处理父类

    至此入参的BeanFactoryPostProcessor和容器中的所有BeanDefinitionRegistryPostProcessor都已经处理完毕,下面开始处理所有的BeanFactoryPostProcessor,因为BeanDefinitionRegistryPostProcessor实现了BeanFactoryPostProcessor,所以这些PostProcessor都需要进行BeanFactoryPostProcessor的相关处理(这也是先处理子类并用集合分别存储的原因)

    同样,在处理父类的过程中,也对未处理过的PostProcessor进行了优先级的判断,但此处进行判断前会先判断这个类有没有被处理过,因为在之前的操作中,已处理过的类会被添加进名为processedBeans的集合中

     

  • 相关阅读:
    拼凑硬币问题
    力扣(LeetCode)14. 最长公共前缀(C++)
    【牛客-剑指offer-数据结构篇】【图解】JZ18 删除链表的节点 Java实现
    Kylin Cube设计革新:维度自动合并的智能策略
    ArcGIS中ArcMap求取点要素在栅格图像中的行列号的方法
    《canvas》之第3章 曲线图形
    在 Android 12 中使用 widget
    dvwa-command injection 代码审计(超详细逐行审计)
    LeetCode 494 目标和
    通达信matlab接口如何读取数据?
  • 原文地址:https://blog.csdn.net/aqin1012/article/details/125913768