BeanFactoryPostProcessor 与 BeanPostProcessor 的区别

在 Spring 框架中,BeanFactoryPostProcessorBeanPostProcessor 是两个核心的扩展接口,它们都用于对 Spring 容器进行自定义处理,但它们的作用时机处理对象使用场景 有显著区别。


🧠 一、核心区别对比表

特性BeanFactoryPostProcessorBeanPostProcessor
处理对象BeanDefinition(Bean 的元信息)Bean 实例
作用时机容器加载完所有 BeanDefinition 后,但尚未实例化任何 Bean 时每个 Bean 实例化之后、初始化之前/之后
处理内容修改 Bean 的定义信息(如类名、属性、作用域等)修改 Bean 实例的行为(如 AOP 代理、字段注入)
是否影响容器结构✅ 是,可以新增、修改、删除 BeanDefinition❌ 否,只影响 Bean 实例
是否支持多个实现✅ 支持多个实现类,可通过 @Order 控制执行顺序✅ 支持多个实现类,可通过 @Order 控制执行顺序
是否可访问容器✅ 可以访问 ConfigurableListableBeanFactory✅ 可以访问容器中的 Bean 实例

🔄 二、详细说明

✅ 1. BeanFactoryPostProcessor

📌 作用:
  • 在 Spring 容器加载完所有 BeanDefinition(即 XML 或注解配置的 Bean 元信息)之后,但在任何 Bean 实例化之前执行。
  • 允许你修改或新增 BeanDefinition,比如:
    • 修改某个 Bean 的类名
    • 修改某个 Bean 的作用域(如 singleton、prototype)
    • 添加新的 BeanDefinition
📁 核心方法:
public interface BeanFactoryPostProcessor {
    void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}
🧩 典型应用场景:
  • PropertyPlaceholderConfigurer:替换配置文件中的占位符(如 ${jdbc.url}
  • MapperScannerConfigurer:扫描 MyBatis 的 Mapper 接口,生成对应的 BeanDefinition
  • 动态注册新 BeanDefinition(如根据配置动态添加 Bean)
🧱 示例:
@Component
public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        if (beanFactory.containsBeanDefinition("myBean")) {
            BeanDefinition bd = beanFactory.getBeanDefinition("myBean");
            bd.setScope(BeanDefinition.SCOPE_PROTOTYPE);
        }
    }
}

✅ 2. BeanPostProcessor

📌 作用:
  • 在每个 Bean 实例化之后、初始化之前/之后执行。
  • 允许你对 Bean 实例进行增强(如 AOP 代理、字段注入、日志增强等)。
  • 不影响容器结构,只影响 Bean 实例。
📁 核心方法:
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;
    }
}
🧩 典型应用场景:
  • AutowiredAnnotationBeanPostProcessor:处理 @Autowired@Value 注解
  • CommonAnnotationBeanPostProcessor:处理 @Resource@PostConstruct@PreDestroy
  • AbstractAutoProxyCreator:AOP 代理生成(如 @Aspect 切面织入)
  • 日志增强、性能监控、安全控制等
🧱 示例:
@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof MyService) {
            return ProxyFactory.getProxy(bean);
        }
        return bean;
    }
}

🧱 三、执行顺序对比

阶段执行内容接口
容器启动初期加载 BeanDefinitionBeanDefinitionRegistryPostProcessor(早于 BeanFactoryPostProcessor
容器结构准备阶段修改 BeanDefinitionBeanFactoryPostProcessor
Bean 实例化阶段实例化 BeanInstantiationAwareBeanPostProcessor(可拦截实例化前/后)
Bean 初始化阶段初始化前调用BeanPostProcessor.postProcessBeforeInitialization()
Bean 初始化完成阶段初始化后调用BeanPostProcessor.postProcessAfterInitialization()

🧩 四、常见使用场景对比

场景推荐接口
替换配置文件中的占位符(如 ${}BeanFactoryPostProcessor
扫描 MyBatis Mapper 接口BeanFactoryPostProcessor
注册新的 BeanDefinitionBeanFactoryPostProcessor
AOP 代理织入(如 @AspectBeanPostProcessor
@Autowired@Resource 注入BeanPostProcessor
@PostConstruct@PreDestroy 处理BeanPostProcessor
日志记录、性能监控、安全控制BeanPostProcessor

❗ 五、注意事项

事项说明
BeanFactoryPostProcessor 无法访问 Bean 实例因为它在 Bean 实例化之前执行
BeanPostProcessor 不能影响容器结构它只能修改 Bean 实例,不能新增或删除 BeanDefinition
两者都可以有多个实现可通过 @Order 或实现 Ordered 接口控制执行顺序
BeanFactoryPostProcessor 通常用于配置处理如替换占位符、动态注册 Bean
BeanPostProcessor 通常用于行为增强如 AOP、字段注入、日志增强等

✅ 六、总结

特性BeanFactoryPostProcessorBeanPostProcessor
作用时机容器加载完 BeanDefinitionBean 实例化后、初始化前后
处理对象BeanDefinitionBean 实例
是否影响容器结构✅ 是❌ 否
是否可访问容器✅ 是✅ 是
典型用途修改配置、注册新 BeanAOP 代理、字段注入、日志增强
执行顺序早于 BeanPostProcessor晚于 BeanFactoryPostProcessor

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值