BeanPostProcessor&BeanFactoryPostProcessor傻傻分不清

时间:2022-12-03 14:56:51

最开始接触spring源码,被一堆的postProcessor搞晕了,翻译也不“包准”,有的翻译为【后置处理器】、有的翻译为【后置增强器】,这里姑且就翻译为处理器吧。


众所周知,在spring框架中,对象分两种,一种是普通bean,一种是容器本身,也就是BeanFactory,而通过两个接口的名字能很容易的识别。


BeanFactoryPostProcessor

BeanFactoryPostProcessor作为众多xxxBeanFactoryPostProcessor接口的父接口,它提供的功能就是处理与BeanFactory相关的内容

源码如下:

@FunctionalInterface
public interface BeanFactoryPostProcessor {

/**
* Modify the application context's internal bean factory after its standard
* initialization. All bean definitions will have been loaded, but no beans
* will have been instantiated yet. This allows for overriding or adding
* properties even to eager-initializing beans.
* @param beanFactory the bean factory used by the application context
* @throws org.springframework.beans.BeansException in case of errors
*/
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;

}

从源码可以得知,只要实现接口,你就能拿到beanFactroy对象,然后对beanFactory里面的信息进行“为所欲为”的修改

因为此时所有的bean的定义信息(definitions)都已经被加载进beanFactory里面了,你可以对他们的属性进行覆盖或者添加,甚至可以提前初始化都可以。


相比于BeanFactoryPostProcessor,只是修改BeanFactory里面的内容,BeanPostProcessor就丰富的多了,因为BeanFactoryPostProcessor发生的时机是BeanFactory创建之后,bean初始化之前,而BeanPostProcessor伴随整个bean的生命周期,实例化前、实例化后、初始化前、初始化后等等

BeanPostProcessor

BeanPostProcessor作为众多xxxBeanPostProcessor接口的父接口,它提供的功能就是处理与bean相关的内容。作为根接口,

它提供了两个基本的方法postProcessBeforeInitialization和postProcessAfterInitialization,分别对应bean的初始化前、初始化后,而BeanPostProcessor有一堆的子接口,常见的有:

InstantiationAwareBeanPostProcessor

SmartInstantiationAwareBeanPostProcessor

MergedBeanDefinitionPostProcessor

spring的自动注入、事务、aop等功能都是通过不同的BeanPostProcessor来实现的。

其类图如下所示

BeanPostProcessor&BeanFactoryPostProcessor傻傻分不清


BeanFactoryPostProcessor执行时机


它的执行时机是创建容器之后的invokeBeanFactoryPostProcessors

BeanPostProcessor&BeanFactoryPostProcessor傻傻分不清




BeanPostProcessor执行时机

不同的子类执行的具体时机不同,但都是在finishBeanFactoryInitialization的过程中。