BeanFactoryPostProcessor、BeanPostProcessor
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
的解析由AutowiredAnnotationBeanPostProcessor
和CommonAnnotationBeanPostProcessor
实现。自定义初始化逻辑
在 Bean 初始化前后插入自定义逻辑(如日志、校验)。@Override public Object postProcessBeforeInitialization(Object bean, String beanName) { if (bean instanceof MyService) { ((MyService) bean).preInit(); } return bean; }
属性修改
动态修改 Bean 的属性值(如加密字段解密)。
关键区别
如何选择?
如果需要修改 Bean 的定义(如调整配置、替换实现类),使用
BeanFactoryPostProcessor
。如果需要修改 Bean 的实例(如生成代理、处理注解),使用
BeanPostProcessor
。
注意事项
执行顺序
BeanFactoryPostProcessor
按PriorityOrdered
>Ordered
> 自然顺序执行。BeanPostProcessor
的执行顺序由Ordered
接口控制。
避免循环依赖
在BeanPostProcessor
中避免处理尚未完全初始化的 Bean。性能影响
BeanPostProcessor
会影响所有 Bean 的创建,需确保逻辑轻量。