You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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组件扫描范围内:
    1. 默认Spring Boot只会扫描启动类所在包及子包下的组件,如果切面类在范围外,需要在启动类上通过@ComponentScan指定扫描路径,示例:
    @ComponentScan(basePackages = {"com.xxx.aspect", "com.xxx.controller"})
    
    1. 可通过在切面类构造方法中打印日志、或者调试的方式,确认切面类是否被成功实例化。
  • 确认切点表达式拼写正确
    你当前代码中的切点表达式存在变量名不一致的风险:@Around("@annotation(myAnotation)")中的变量名myAnotation需要和方法入参的参数名完全一致,你的入参名是MyAnnotation annotation,所以要么修改切点为@Around("@annotation(annotation)"),要么修改入参名为MyAnnotation myAnotation,否则切点匹配会失败。
  • 确认注解加在正确的方法上
    1. AOP只能拦截public修饰的方法,确认目标方法为public修饰
    2. 确认@MyAnnotation是加在控制器的HTTP映射方法上,且该方法确实是你调用接口时触发执行的方法;如果是类内部调用本类的方法,不会走代理逻辑,也无法触发切面。
  • 排查多切面优先级冲突
    如果项目中存在多个切面,可在切面类上添加@Order(数字)注解设置优先级,数字越小优先级越高,避免切面被其他逻辑拦截。

内容的提问来源于stack exchange,提问作者Alex Roitman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 07:15:06