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

【Spring源码系列- IOC】

1

【Spring源码】0.安装Gradle环境

2

【Spring源码】1.下载与编译_pom relocation to an other version number is not f

3

【Spring源码】2.试个水先~Debug找到传说中的三级缓存(图解向,堆图预警)

4

【Spring源码】3. xml文件如何转换成BeanDefinition(主要涉及prepareRefresh()+ obtainFreshBeanFactory()两个函数,图解向,堆图预警)_spring xml转bean

5

【Spring源码】4. 自己搞个标签?~自定义标签保姆级全过程(图解向,堆图预警)

6

【Spring源码】5.spring的bean工厂准备工作(prepareBeanFactory(beanFactory)

7

【Spring源码】6. Spring扩展自定义属性编辑器保姆级教程

8

【Spring源码】7. 如何添加自定义的BeanFactoryPostProcessor

9

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

10

【Spring源码】9. 超级重要的ConfigurationClassPostProcessor

11

【Spring源码】10. 递归调用的processConfigurationClass()方法

12

【Spring源码】11. 我是注解类不?checkConfigurationClassCandidate()注解类判断方法详解

13

【Spring源码】12. 注册bean处理器registerBeanPostProcessors()

14

【Spring源码】13. 国际化处理initMessageSource()源码解析

【补充内容】【保姆级】SpringBoot项目中的i18n国际化

15

【Spring源码】14. 消息多播器(观察者模式)

【补充内容】【保姆级示例向】观察者模式

16

【Spring源码】15. Bean的创建过程(1.概述篇)

17

【Spring源码】16. Bean的创建过程(2)

18

【Spring源码】17.创建Bean这篇认真的@(・●・)@

【补充内容】

【保姆级·创建对象】如何通过Supplier创建对象

【保姆级·创建对象】如何通过factory-method创建对象

【保姆级·创建对象】如何利用resolveBeforeInstantiation()在预处理阶段返回一个Bean的实例对象

19

【Spring源码】18. factory-method创建对象关键函数详解:instantiateUsingFactoryMethod()

20

【Spring源码】19. 没合适的构造器?找determineCandidateConstructors()!

21

【Spring源码】20. MergedBeanDefinitionPostProcessor修改/合并bean定义

【补充内容】

【保姆级】@PostConstruct & @PreDestroy使用示例

【Spring源码】AutowiredAnnotationBeanPostProcessor.postProcessMergedBeanDefinition()详解

【Spring源码】CommonAnnotationBeanPostProcessor.postProcessMergedBeanDefinition()详解

22

【Spring源码】21. 初探循环依赖

【补充内容】

【保姆级】手把手Debug循环依赖的整体流程

【实践向】当移除了三级缓存……

【分析向】没有三级缓存会导致什么?

【Spring源码】插播一个创建代理对象的wrapIfNecessary()方法

23

【Spring源码】22. 属性填充populateBean()详解

【补充内容】

【Spring源码】自动注入·名称:autowireByName()详解

【Spring源码】自动注入·类型:autowireByType()详解

【Spring源码】属性值的解析与赋值:populateBean().applyPropertyValues()

【保姆级】超超超简单的自定义注解实现@Autowired同款功能

24

【Spring源码】23. 执行初始化逻辑:initializeBean()

目录

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

处理顺序

1. 处理外部集合

2. 处理子类

3. 处理父类


看下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的集合中

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AQin1012

求小鱼干呢~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值