2021-07-14阅读小笔记:Spring ioc 之 BeanPostProcessor与BeanFactoryPostProcessor

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 的生命周期中的各种回调时机。

  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 高。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值