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方法将在初始化手段后执行。
3、BeanPostProcessor 的扩展都有哪些?
InstantiationAwareBeanPostProcessor、DestructionAwareBeanPostProcessor、MergeDefinitionPostProcessor等
4、 InstantiationAwareBeanPostProcessor 扩展了哪些回调时机?
InstantiationAwareBeanPostProcessor 扩展了两个时机:
- postProcessBeforeInstantiation: Bean 实例化前拦截
- postProcessProperties:Bean属性注入和自动装配前拦截
5、整理现有已经学过的 bean 的生命周期中的各种回调时机。
- 初始化:@PostConstruct、InitializingBean、initMethod
- 销毁:@PreDestroy、DisposableBean、destoryMethod
- 初始化前后:BeanPostProcessor#postProcessBeforeInitialization、BeanPostProcessor#postProcessAfterInitialization
- 实例化前&实例化后属性赋值/自动装配前:InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation、InstantiationAwareBeanPostProcessor#postProcessProperties
- 销毁前:DestructionAwareBeanPostProcessor#postProcessBeforeDestruction
- 实例化后,自动注入之前: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 高。