【Spring源码系列- IOC】
目录
看下invokeBeanFactoryPostProcessors()
函数的源码同学应该会发现这个方法跟之前文章中提过的getBean ()
一样(它不是一个人在战斗)他有很多重载方法=_=,最终执行具体逻辑的方法中也有很多重复的部分,嘿嘿上篇还进行了相关的扩展,这篇文章我们来捋捋这个函数的流程(。・ω・。)ノ
先通过refresh()
函数进入到invokeBeanFactoryPostProcessors()
中(如果不知道怎么进入refresh()
函数,建议移步到【Spring源码】系列第一篇开始看哦(*¯︶¯*))
然后进入这个方法,会发现里面有一个重载的方法,这个方法多了一个参数getBeanFactoryPostProcessors()
这个参数的返回值是一个BeanFactoryPostProcessor的列表,里面是需要处理的BeanFactoryPostProcessor的外部集合
我们进入PostProcessorRegistrationDelqegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());方法中
开始捋》〉手把手那种(*≧ω≦)
首先这个函数是处理BeanFactoryPostProcessors()的(详细的可以看上篇7),大致浏览下可以看到这个方法里有很多重复的功能块(感觉有点啰啰嗦嗦(_ _).。o○),但实际上,这个函数就做了两件事,一个是判断是否需要执行postProcessBeanDefinitionRegistry()方法(需要就执行),另一个是执行postProcessBeanFactory()方法。
而之所以反反反复复复主要耽误在这个判断上,因为不是所有的PostProcessor都需要执行postProcessBeanDefinitionRegistry()方法。
而我们的PostProcessor主要有三类来源,而invokeBeanFactoryPostProcessors()函数将这些需要加载的BeanFactoryPostProcessors分成三类来做处理,但实际上这三类都是判断是否需要执行这俩函数,即处理流程大同小异,所以看起来代码有些重复啰嗦。
处理顺序
-
外部集合(getBeanFactoryPostProcessors()传入的参数)
-
子集(BeanDefinitionRegistryPostProcesssor)
-
父集(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的集合中
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135414.html