Spring启动出现DefaultPointcutAdvisor类Bean未被所有BeanPostProcessors处理警告怎么解决
警告触发原因
这个警告是Spring AOP初始化的常见场景,核心原因如下:
- Spring中负责创建AOP代理的组件是
AnnotationAwareAspectJAutoProxyCreator,它本身是一个BeanPostProcessor,启动时优先级极高,会提前扫描容器中所有Advisor类型的Bean,用来后续判断哪些普通Bean需要被切面增强。 - 你代码中定义的
advisorBean属于AOP基础设施类Bean,会在普通Bean初始化流程之前就被提前实例化,此时容器中大部分BeanPostProcessor还没完成初始化,无法对这个提前实例化的advisorBean做后续处理,所以Spring会抛出该警告,提示该Bean不会被所有后置处理器处理(包括自动代理)。 - 另外你在
advisor()方法中直接调用interceptor()获取通知Bean,会触发配置类的方法增强逻辑,进一步加重提前初始化的冲突。
修复方案
方案1(最推荐):标记Bean为基础设施类型
给advisor Bean添加@Role(BeanDefinition.ROLE_INFRASTRUCTURE)注解,显式告诉Spring这个Bean属于框架基础设施组件,不需要走普通Bean的完整后置处理器处理流程,警告会直接消除,修改代码如下:
import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Role; @Configuration @EnableAspectJAutoProxy public class Config { @Bean @Role(BeanDefinition.ROLE_INFRASTRUCTURE) public Advisor advisor() { AspectJExpressionPointcut ajp = new AspectJExpressionPointcut(); ajp.setExpression("execution(public * my.package..*.*(..))"); return new DefaultPointcutAdvisor(ajp, interceptor()); } // 你的interceptor Bean定义 @Bean public MethodInterceptor interceptor() { // 逻辑实现 } }
方案2:优化依赖注入方式
将interceptor通过方法参数注入,避免直接调用配置类的方法触发提前代理,配合@Role注解使用效果更好:
@Bean @Role(BeanDefinition.ROLE_INFRASTRUCTURE) public Advisor advisor(MethodInterceptor interceptor) { AspectJExpressionPointcut ajp = new AspectJExpressionPointcut(); ajp.setExpression("execution(public * my.package..*.*(..))"); return new DefaultPointcutAdvisor(ajp, interceptor); }
方案3:直接忽略
如果你的业务不需要对advisor Bean本身做增强,这个警告完全不影响正常功能,可以选择忽略,不过不推荐,显式标记更符合Spring规范。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

