BeanFactoryPostProcessor和BeanPostProcessor在 Bean 生命周期中的作用是什么

BeanFactoryPostProcessorBeanPostProcessor 是 Spring 框架提供的两个重要扩展点,它们在 Bean 生命周期的不同阶段允许开发者对其进行定制。

Bean 生命周期回顾

在了解这两个接口的作用之前,我们先简单了解一下 Spring Bean 的生命周期:

  1. Bean 定义加载: Spring 容器读取 Bean 定义(XML、注解、Java 配置)。
  2. BeanFactoryPostProcessor 调用 (可选): 在 Bean 实例化之前,修改 BeanFactory 的配置元数据。
  3. BeanDefinitionRegistryPostProcessor 调用 (可选): 在 Bean 定义加载完成后,但在 Bean 实例化之前执行,允许添加、删除或修改 Bean 定义。
  4. 实例化 (Instantiation): Spring 容器创建 Bean 的实例(通过构造函数或工厂方法)。
  5. 属性填充 (Populate Properties): Spring 容器为 Bean 的属性赋值(Setter 注入、字段注入)。
  6. Aware 接口回调: 如果 Bean 实现了 Aware 接口,Spring 容器会调用相应的方法。
  7. BeanPostProcessor 前置处理: 调用 BeanPostProcessorpostProcessBeforeInitialization 方法。
  8. 初始化 (Initialization):
    • @PostConstruct 注解标注的方法
    • InitializingBean 接口的 afterPropertiesSet 方法
    • Bean 定义中指定的 init-method 方法
  9. BeanPostProcessor 后置处理: 调用 BeanPostProcessorpostProcessAfterInitialization 方法。
  10. Bean 就绪 (Ready to Use): Bean 可以被应用程序使用了。
  11. 销毁 (Destruction): (容器关闭, 且Bean的作用域是singleton)
    • @PreDestroy 注解标注的方法
    • DisposableBean 接口的 destroy 方法
    • Bean 定义中指定的 destroy-method 方法

BeanFactoryPostProcessor 的作用:

  • 作用时机: 在 Bean 定义加载完成之后、Bean 实例化 之前

  • 作用对象: BeanFactory 本身以及 Bean 定义 (BeanDefinition)。

  • 主要功能:

    • 修改 Bean 定义: 这是 BeanFactoryPostProcessor 最重要的功能。它可以修改 BeanDefinition 的任何属性,例如:
      • 修改 Bean 的类名 (setBeanClassName)
      • 修改 Bean 的作用域 (setScope)
      • 修改 Bean 的属性值 (getPropertyValues().addPropertyValue(...))
      • 添加或删除 Bean 的依赖关系 (setDependsOn)
      • 修改 Bean 的初始化方法和销毁方法 (setInitMethodName, setDestroyMethodName)
      • 修改 Bean 的自动装配模式 (setAutowireMode)
      • 等等
    • 注册自定义的属性编辑器 (PropertyEditor): 可以使用 ConfigurableBeanFactoryregisterCustomEditor 方法注册自定义的 PropertyEditor,用于将字符串类型的配置值转换为 Bean 属性所需的类型。
    • 读取外部配置: 可以读取外部配置文件(例如,properties 文件、YAML 文件、数据库等),并根据配置信息修改 Bean 定义。
  • 执行顺序: 如果有多个 BeanFactoryPostProcessor, Spring 会根据它们的顺序(PriorityOrderedOrdered 或无序)依次调用。 BeanDefinitionRegistryPostProcessor 会先于普通的 BeanFactoryPostProcessor 执行.

BeanPostProcessor 的作用:

  • 作用时机: 在 Bean 实例化、属性填充 之后,但在 Bean 初始化方法执行 前后

  • 作用对象: Bean 实例。

  • 主要功能:

    • 修改 Bean 实例: 可以修改 Bean 的属性值,或者返回一个完全不同的 Bean 实例(例如,代理对象)。
    • 执行自定义的初始化逻辑: 可以在 Bean 初始化之前或之后执行一些自定义的逻辑。
    • AOP (面向切面编程): Spring AOP 就是通过 BeanPostProcessor 来实现的。AbstractAutoProxyCreator 就是一个 BeanPostProcessor,它会在 Bean 初始化后创建代理对象。
    • 处理注解: 例如处理 @Autowired@Value@Resource 等注解。
  • 关键方法:

    • postProcessBeforeInitialization(Object bean, String beanName): 在 Bean 初始化 之前 调用。
    • postProcessAfterInitialization(Object bean, String beanName): 在 Bean 初始化 之后 调用。
  • 执行顺序: 如果有多个 BeanPostProcessor,Spring 会根据它们的顺序(PriorityOrderedOrdered 或无序)依次调用。

BeanFactoryPostProcessorBeanPostProcessor 在 Bean 生命周期中的位置:

+-----------------------+
|   Bean 定义加载        |
+-----------------------+
        |
        V
+-----------------------+
| BeanFactoryPostProcessor|  <-- 在 Bean 实例化之前调用,修改 Bean 定义
+-----------------------+
        |
        V
+------------------------+
|BeanDefinitionRegistryPP|  <-- 在 Bean 定义加载完成后,但在 Bean 实例化之前执行,允许添加、删除或修改 Bean 定义
+------------------------+
        |
        V
+-----------------------+
|   实例化              |
+-----------------------+
        |
        V
+-----------------------+
|   属性填充             |
+-----------------------+
        |
        V
+-----------------------+
|   Aware 接口回调      |
+-----------------------+
        |
        V
+-----------------------+
| BeanPostProcessor     |  <-- 在初始化之前调用,修改 Bean 实例或执行自定义逻辑
|  (前置处理)           |
+-----------------------+
        |
        V
+-----------------------+
|   初始化              |
+-----------------------+
        |
        V
+-----------------------+
| BeanPostProcessor     |  <-- 在初始化之后调用,修改 Bean 实例或执行自定义逻辑 (AOP)
|  (后置处理)           |
+-----------------------+
        |
        V
+-----------------------+
|   Bean 就绪           |
+-----------------------+
        |
        V
+-----------------------+
|   销毁                |
+-----------------------+

总结:

  • BeanFactoryPostProcessor 在 Bean 实例化之前修改 Bean 定义,影响所有 Bean 的创建过程。
  • BeanPostProcessor 在 Bean 初始化前后修改 Bean 实例,可以针对特定 Bean 或所有 Bean 进行处理。
  • 这两个接口都是 Spring 框架的重要扩展点,允许我们在开发时对Bean 生命周期的不同阶段进行自定义,实现更灵活、更强大的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值