PostProcessor英文翻译为后置处理器,在Spring体系里面主要针对的对象为Bean和BeanFactory.有着收尾或完善的作用。
一、BeanPostProcessor分支
1.1、作用
在Bean对象在实例化和依赖注入完毕后,在显示调用初始化方法的前后添加我们自己的逻辑。注意是Bean实例化完毕后及依赖注入完成后触发的。
1.2、注册时机
refresh方法中在调用工厂后置处理器后注册
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)
二、BeanFactoryPostProcessor分支
2.1、整体结构图
2.2、类解析
2.2.1、BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor
做任何事情都要有目的,如果没有,则事倍功半,所以,在去理解这几个类的作用之前我们需要先确定我们的目标:
- 这两个后置处理器的作用是什么?
- 他们在spring里面哪里起着怎样的作用?
我们首先需要了解BeanFactoryPostProcessor 和BeanDefinitionRegistryPostProcessor为Spring在容器初始化时对外对外暴露的扩展点,方便我们开发人员开发。两者侧重点不同,BeanDefinitionRegistryPostProcessor 侧重于注册BeanDefinition ,BeanFactoryPostProcessor 侧重于修改BeanDefinition。他们起作用的时机在于容器加载注册BeanDefinition完成之后。
2.2.1.1、两个后置处理器的作用
-
BeanFactoryPostProcessor的作用原理——为什么BeanFactoryPostProcessor可以修改BeanDefinition?
如下图,这个是BeanFactoryPostProcessor接口,里面只有一个方法,Spring就是通过这个方法来实现修改BeanDefinition。
这个方法只有一个参数,即父类为ConfigurableListableBeanFactory的bean工厂类,这个类有一个方法,如下图:
它可以获取指定bean的bean定义,并修改bean对应的定义信息(BeanDefinition)。
-
BeanDefinitionRegistryPostProcessor的作用原理——为什么BeanDefinitionRegistryPostProcessor可以注册BeanDefinition?
同BeanFactoryPostProcessor一样,BeanDefinitionRegistryPostProcessor同样也是通过一个方法来起到注册BeanDefinition的作用,如下图:
通过BeanDefinitionRegistry类来修改、注册、删除等操作,不过一般来说都是用来注册。如下图:
2.2.1.2、他们在spring里面哪里起着怎样的作用
要想明白这两个后置处理器的执行位置,起着怎样的作用,我们就要了解一个方法——PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors,我们从头来看。
这是刷新工厂12大步,是spring框架的主要流程,其中我们需要看的方法就是下图(删除了多余的注释)圈中的方法,bean工厂的后置处理器就在这里调用:
执行PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors方法:
2.2.1.2.1、整体执行流程
这个方法主要分为两大步:
第一步,先执行BeanDefinitionRegistryPostProcessor后置处理器;第二步,再执行BeanFactoryPostProcessor后置处理器。每一步里面又细分三小步,先处理实现PriorityOrdered接口的,再执行Ordered接口的,最后执行一个排序接口都没实现的后置处理器。所以如果想要先执行,可以添加PriorityOrdered或者Ordered接口。
第一大步:
第二大步:
2.2.1.2.2、执行流程详解
1、registryProcessors集合和regularPostProcessors集合的作用
2、for循环里执行postProcessBeanDefinitionRegistry()方法的意义
我们知道BeanDefinitionRegistryPostProcessor是继承了BeanFactoryPostProcessor的;所以,BeanDefinitionRegistryPostProcessor除了需要执行它自身的postProcessBeanDefinitionRegistry()方法,还需要执行BeanFactoryPostProcessor的postProcessBeanFactory()方法,且BeanDefinitionRegistryPostProcessor是支持注册BeanDefinition,这也包括BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor,所以,在方法的一开始,遍历的时候就执行了postProcessBeanDefinitionRegistry()方法,以防内部存在需要注册的后置处理器。如图: