【Java】【系列篇】【Spring源码解析】【三】【体系】【PostProcessors体系】

PostProcessor英文翻译为后置处理器,在Spring体系里面主要针对的对象为Bean和BeanFactory.有着收尾或完善的作用。

一、BeanPostProcessor分支

image-20230116144807899

1.1、作用

在Bean对象在实例化和依赖注入完毕后,在显示调用初始化方法的前后添加我们自己的逻辑。注意是Bean实例化完毕后及依赖注入完成后触发的。

1.2、注册时机

refresh方法中在调用工厂后置处理器后注册

image-20230116142131562

1.3、调用时机

调用路径:

AbstractApplicationContext#refresh()
	finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory)
DefaultListableBeanFactory#preInstantiateSingletons()
AbstractBeanFactory#getBean(String name)
    doGetBean(String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
AbstractAutowireCapableBeanFactory#createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
    doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
    initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd)

image-20230116144512663

image-20230116142924308

二、BeanFactoryPostProcessor分支

2.1、整体结构图

image-20221213100935386

2.2、类解析

2.2.1、BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor

做任何事情都要有目的,如果没有,则事倍功半,所以,在去理解这几个类的作用之前我们需要先确定我们的目标

  1. 这两个后置处理器的作用是什么?
  2. 他们在spring里面哪里起着怎样的作用?

我们首先需要了解BeanFactoryPostProcessor 和BeanDefinitionRegistryPostProcessor为Spring在容器初始化时对外对外暴露的扩展点,方便我们开发人员开发。两者侧重点不同,BeanDefinitionRegistryPostProcessor 侧重于注册BeanDefinition ,BeanFactoryPostProcessor 侧重于修改BeanDefinition。他们起作用的时机在于容器加载注册BeanDefinition完成之后

2.2.1.1、两个后置处理器的作用
  • BeanFactoryPostProcessor的作用原理——为什么BeanFactoryPostProcessor可以修改BeanDefinition?

    如下图,这个是BeanFactoryPostProcessor接口,里面只有一个方法,Spring就是通过这个方法来实现修改BeanDefinition。

    image-20221213141053605

    这个方法只有一个参数,即父类为ConfigurableListableBeanFactory的bean工厂类,这个类有一个方法,如下图:

    image-20221213140550366

    它可以获取指定bean的bean定义,并修改bean对应的定义信息(BeanDefinition)。

image-20221213141608455

  • BeanDefinitionRegistryPostProcessor的作用原理——为什么BeanDefinitionRegistryPostProcessor可以注册BeanDefinition?

    同BeanFactoryPostProcessor一样,BeanDefinitionRegistryPostProcessor同样也是通过一个方法来起到注册BeanDefinition的作用,如下图:

image-20221213142502194

​ 通过BeanDefinitionRegistry类来修改、注册、删除等操作,不过一般来说都是用来注册。如下图:

image-20221213142745915

2.2.1.2、他们在spring里面哪里起着怎样的作用

要想明白这两个后置处理器的执行位置,起着怎样的作用,我们就要了解一个方法——PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors,我们从头来看。

这是刷新工厂12大步,是spring框架的主要流程,其中我们需要看的方法就是下图(删除了多余的注释)圈中的方法,bean工厂的后置处理器就在这里调用:

image-20221213143848353

执行PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors方法:

image-20221213144312578

2.2.1.2.1、整体执行流程

这个方法主要分为两大步:

第一步,先执行BeanDefinitionRegistryPostProcessor后置处理器;第二步,再执行BeanFactoryPostProcessor后置处理器。每一步里面又细分三小步,先处理实现PriorityOrdered接口的,再执行Ordered接口的,最后执行一个排序接口都没实现的后置处理器。所以如果想要先执行,可以添加PriorityOrdered或者Ordered接口。

第一大步:

image-20221213151008907

第二大步:

image-20221213152001624

2.2.1.2.2、执行流程详解
1、registryProcessors集合和regularPostProcessors集合的作用

image-20221213161826518

2、for循环里执行postProcessBeanDefinitionRegistry()方法的意义

我们知道BeanDefinitionRegistryPostProcessor是继承了BeanFactoryPostProcessor的;所以,BeanDefinitionRegistryPostProcessor除了需要执行它自身的postProcessBeanDefinitionRegistry()方法,还需要执行BeanFactoryPostProcessor的postProcessBeanFactory()方法,且BeanDefinitionRegistryPostProcessor是支持注册BeanDefinition,这也包括BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor,所以,在方法的一开始,遍历的时候就执行了postProcessBeanDefinitionRegistry()方法,以防内部存在需要注册的后置处理器。如图:

image-20221213160407129

3、选取相似的一段流程讲解

image-20221213162427289

4、if判断的必要性

image-20221213162838773

3、选取相似的一段流程讲解

image-20221213162427289

4、if判断的必要性

image-20221213162838773

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值