SpringBoot API中自定义AOP切面未被触发执行的问题排查咨询
Spring Boot REST接口调用时AOP切面不生效排查方案
按优先级从高到低排查以下问题:
- 确认开启了AspectJ自动代理
单元测试中你手动注册了AnnotationAwareAspectJAutoProxyCreator,但正式启动的Spring Boot项目需要在启动类/配置类上添加@EnableAspectJAutoProxy注解开启切面自动代理功能,示例:
其中@SpringBootApplication @EnableAspectJAutoProxy(proxyTargetClass = true) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }proxyTargetClass = true表示强制使用CGLIB代理,可避免控制器实现接口时JDK动态代理无法拦截类方法的问题;如有内部调用获取代理对象的需求,可额外添加参数exposeProxy = true。 - 确认切面类被Spring容器扫描实例化
你的切面类已添加@Component注解,需要确认切面类所在的包在Spring组件扫描范围内:- 默认Spring Boot只会扫描启动类所在包及子包下的组件,如果切面类在范围外,需要在启动类上通过
@ComponentScan指定扫描路径,示例:
@ComponentScan(basePackages = {"com.xxx.aspect", "com.xxx.controller"})- 可通过在切面类构造方法中打印日志、或者调试的方式,确认切面类是否被成功实例化。
- 默认Spring Boot只会扫描启动类所在包及子包下的组件,如果切面类在范围外,需要在启动类上通过
- 确认切点表达式拼写正确
你当前代码中的切点表达式存在变量名不一致的风险:@Around("@annotation(myAnotation)")中的变量名myAnotation需要和方法入参的参数名完全一致,你的入参名是MyAnnotation annotation,所以要么修改切点为@Around("@annotation(annotation)"),要么修改入参名为MyAnnotation myAnotation,否则切点匹配会失败。 - 确认注解加在正确的方法上
- AOP只能拦截public修饰的方法,确认目标方法为public修饰
- 确认
@MyAnnotation是加在控制器的HTTP映射方法上,且该方法确实是你调用接口时触发执行的方法;如果是类内部调用本类的方法,不会走代理逻辑,也无法触发切面。
- 排查多切面优先级冲突
如果项目中存在多个切面,可在切面类上添加@Order(数字)注解设置优先级,数字越小优先级越高,避免切面被其他逻辑拦截。
内容的提问来源于stack exchange,提问作者Alex Roitman
相关产品推荐
相关产品推荐

