BeanFactoryPostProcessor、BeanPostProcessor

2 19~25 min

BeanFactoryPostProcessor 和 BeanPostProcessor 是 Spring 框架中用于干预 Bean 生命周期的重要扩展点,但它们的触发时机和作用对象不同,适用场景也各有侧重:


1. BeanFactoryPostProcessor

作用时机

在 Spring 容器初始化阶段,所有 Bean 的定义(BeanDefinition)加载完成后,但 Bean 实例化之前 执行。

核心作用

修改或增强 Bean 的定义BeanDefinition),例如调整 Bean 的配置元数据(属性值、作用域、依赖关系等)。

典型使用场景

  • 动态修改配置
    例如通过占位符(${})解析外部配置(如 PropertySourcesPlaceholderConfigurer)。

    public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
            BeanDefinition bd = beanFactory.getBeanDefinition("myBean");
            bd.getPropertyValues().add("propertyName", "newValue");
        }
    }
  • 条件化注册 Bean
    根据运行时条件动态添加或移除 Bean 的定义。
    例如结合 @Conditional 注解实现条件化配置。

  • 替换 Bean 的 Class 实现
    在运行时动态修改 Bean 的实际实现类(通过 BeanDefinition.setBeanClassName())。


2. BeanPostProcessor

作用时机

在 Spring Bean 实例化阶段,对每个 Bean 实例进行后处理。具体时机:

  • 初始化前postProcessBeforeInitialization()

  • 初始化后postProcessAfterInitialization()

核心作用

修改或增强 Bean 实例,例如代理生成、属性注入、自定义初始化逻辑。

典型使用场景

  • AOP 代理生成
    AbstractAutoProxyCreator 通过 BeanPostProcessor 在 Bean 初始化后生成代理对象。

    public class MyBeanPostProcessor implements BeanPostProcessor {
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) {
            // 生成代理对象
            return Proxy.newProxyInstance(...);
        }
    }
  • 注解处理
    例如 @Autowired@PostConstruct 的解析由 AutowiredAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessor 实现。

  • 自定义初始化逻辑
    在 Bean 初始化前后插入自定义逻辑(如日志、校验)。

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) {
        if (bean instanceof MyService) {
            ((MyService) bean).preInit();
        }
        return bean;
    }
  • 属性修改
    动态修改 Bean 的属性值(如加密字段解密)。


关键区别

特性

BeanFactoryPostProcessor

BeanPostProcessor

作用对象

Bean 的定义(BeanDefinition

Bean 的实例(已创建的 Java 对象)

触发时机

容器启动时,Bean 实例化之前

Bean 初始化阶段(每个 Bean 实例化时)

作用范围

全局,所有 Bean 的定义

所有 Bean 的实例

典型用途

修改配置元数据、条件注册 Bean

代理生成、注解处理、属性增强


如何选择?

  • 如果需要修改 Bean 的定义(如调整配置、替换实现类),使用 BeanFactoryPostProcessor

  • 如果需要修改 Bean 的实例(如生成代理、处理注解),使用 BeanPostProcessor


注意事项

  1. 执行顺序

    • BeanFactoryPostProcessorPriorityOrdered > Ordered > 自然顺序执行。

    • BeanPostProcessor 的执行顺序由 Ordered 接口控制。

  2. 避免循环依赖
    BeanPostProcessor 中避免处理尚未完全初始化的 Bean。

  3. 性能影响
    BeanPostProcessor 会影响所有 Bean 的创建,需确保逻辑轻量。