1、什么是 BeanPostProcessor ?

BeanPostProcessor 是 IOC 容器的一个扩展点,提供回调机制,支持我们在 Bean 的初始化前后做一些额外的处理。

2、BeanPostProcessor 发挥作用的时间点是什么?它与 bean 的生命周期有什么关系?

BeanPostProcessor 接口提供的回调钩子:

public interface BeanPostProcessor {
@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}

@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}

上面也提到,BeanPostProcessor提供的回调机制,支持在 Bean 的初始化前后做额外的处理;而Spring 提供的初始化手段有:@PostConstruct注解、实现InitializingBean接口和设置 initMethod 方法。

因此,BeanPostProcessor的postProcessBeforeInitialization方法将在初始化手段前执行,而postProcessAfterInitialization方法将在初始化手段后执行。

2021-07-14阅读小笔记:Spring ioc 之 BeanPostProcessor与BeanFactoryPostProcessor_实例化

3、BeanPostProcessor 的扩展都有哪些?

InstantiationAwareBeanPostProcessor、DestructionAwareBeanPostProcessor、MergeDefinitionPostProcessor等

4、 InstantiationAwareBeanPostProcessor 扩展了哪些回调时机?

InstantiationAwareBeanPostProcessor 扩展了两个时机:


  • postProcessBeforeInstantiation: Bean 实例化前拦截
  • postProcessProperties:Bean属性注入和自动装配前拦截

5、整理现有已经学过的 bean 的生命周期中的各种回调时机。


  1. 初始化:@PostConstruct、InitializingBean、initMethod
  2. 销毁:@PreDestroy、DisposableBean、destoryMethod
  3. 初始化前后:BeanPostProcessor#postProcessBeforeInitialization、BeanPostProcessor#postProcessAfterInitialization
  4. 实例化前&实例化后属性赋值/自动装配前:InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation、InstantiationAwareBeanPostProcessor#postProcessProperties
  5. 销毁前:DestructionAwareBeanPostProcessor#postProcessBeforeDestruction
  6. 实例化后,自动注入之前:MergeDefinitionPostProcessor#postProcessMergedBeanDefinition

6、什么是 BeanFactoryPostProcessor ?它与 BeanPostProcessor 有什么不同?

BeanFactoryPostProcess 是 IOC 容器的一个扩展点,它用于 IOC 容器的生命周期中,所有 BeanDefinition 都注册到 BeanFactory 后回调触发,用于访问 / 修改已经存在的 BeanDefinition 。与 BeanPostProcessor 相同,它们都是容器隔离的,不同容器中的 BeanFactoryPostProcessor 不会相互起作用。

BeanFactoryPostProcessor 是针对 BeanDefinition 的扩展点,而 BeanPostProcessor 是针对 Bean 实例的扩展点,两个扩展点的回调触发点都在不同的生命周期中。BeanFactoryPostProcessor 主要用于对 BeanDefinition 增加/删除属性、或者移除BeanDefinition;而 BeanPostProcessor 主要是用于给 Bean 实例赋值和做增强,如创建代理对象等。

7、BeanFactoryPostProcessor 与 BeanDefinitionRegistryPostProcessor 又有什么不同?

BeanDefinitionRegistryPostProcessor 是 BeanFactoryPostProcessor 的子接口,它在 BeanFactoryPostProcessor 的基础上增强了一个方法:postProcessBeanDefinitionRegistry,允许在 BeanFactoryPostProcessor 之前注册其他的 BeanDefinition。

因为 BeanDefinitionRegistryPostProcessor 是 BeanFactoryPostProcessor 是子接口,所以 BeanDefinitionRegistryPostProcessor 也同时拥有 BeanFactoryPostProcessor 的回调钩子,但是 BeanDefinitionRegistryPostProcessor 的执行优先级比 BeanFactoryPostProcessor 高。