BeanPostProcessor 是 Spring 提供的在 Bean 初始化前后自定义处理的扩展点,不参与创建和依赖注入,只在依赖注入完成后、初始化方法执行前/后介入;需实现两个返回非 null 对象的方法,并通过 @Component、@Bean 或 addBeanPostProcessor 注册;支持 Ordered/@Order 控制执行顺序;典型用途包括 AOP 代理生成与字段校验。

在 Spring 中,BeanPostProcessor 是一个用于在 Bean 初始化前后进行自定义处理的扩展点。它不参与 Bean 的创建过程(如构造、依赖注入),而是在 依赖注入完成之后、初始化方法(如 @PostConstruct 或 InitializingBean.afterPropertiesSet())执行之前/之后 插入逻辑。
实现 BeanPostProcessor 接口
只需新建一个类,实现 BeanPostProcessor 接口,并重写两个核心方法:
-
postProcessBeforeInitialization(Object bean, String beanName):在 Bean 初始化(init-method / @PostConstruct)前调用,可用于包装、校验、属性增强等; -
postProcessAfterInitialization(Object bean, String beanName):在 Bean 初始化完成后调用,常用于代理生成(如 AOP)、缓存包装、日志装饰等。
注意:这两个方法必须返回对象(可以是原对象,也可以是新对象,比如代理对象)。若返回 null,Spring 会抛出异常。
注册为 Spring Bean
实现类本身需要被 Spring 容器管理,通常通过以下任一方式注册:
立即学习“Java免费学习笔记(深入)”;
- 加
@Component注解(需确保所在包被@ComponentScan扫描); - 在配置类中用
@Bean方法返回该处理器实例; - 手动调用
ConfigurableApplicationContext.addBeanPostProcessor()(较少用,多见于测试或特殊启动逻辑)。
Spring 会自动识别所有 BeanPostProcessor 类型的 Bean,并在容器刷新时注册到内部处理器链中。
执行顺序与优先级控制
多个 BeanPostProcessor 默认按注册顺序执行。如需指定顺序,可让其实现 Ordered 接口或添加 @Order 注解:
- 数值越小,优先级越高(
Ordered.HIGHEST_PRECEDENCE = Integer.MIN_VALUE); - 例如:
@Order(10)的处理器会在@Order(20)之前执行; - 也可继承
PriorityOrdered(优先级高于Ordered)。
典型使用场景示例
比如给所有标注了 @Loggable 的 Bean 自动添加日志代理:
- 在
postProcessAfterInitialization中检查bean.getClass().isAnnotationPresent(Loggable.class); - 若匹配,用
ProxyFactory创建 JDK 动态代理或 CGLIB 代理,织入日志逻辑; - 返回代理对象,后续对该 Bean 的调用都会经过日志拦截。
又如,在 postProcessBeforeInitialization 中对某些字段做非空校验或默认值填充,避免重复写在每个 Bean 的 init 方法里。


















