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

Spring Boot原生AspectJ无法拦截同类注解嵌套方法问题

问题修复方案

你的嵌套方法拦截失效核心是Spring AOP代理与原生AspectJ加载时织入配置冲突、依赖版本不统一、织入规则配置错误导致的,按以下步骤修改即可:

  • 删除冲突的代理配置:去掉TrackTimeConfig类上的@EnableAspectJAutoProxy(proxyTargetClass = true)注解。该注解的作用是开启Spring基于动态代理的AOP实现,和原生AspectJ直接修改类字节码的织入逻辑互斥,保留该配置时Spring仍会为Bean创建代理对象,类内部的this调用不会经过代理,自然无法被拦截。
  • 统一AspectJ依赖版本:你当前pom文件中引入的aspectjweaver版本为1.8.13,但启动参数中指定的aspectjweaver javaagent版本为1.9.6,版本不一致会直接导致织入逻辑异常,将pom中aspectjweaver的版本调整为1.9.6,和javaagent指向的版本完全对齐。
  • 修正aop.xml织入范围规则:当前配置的<include within="in.xxx.*"/>仅能匹配in.xxx包下的直接类,无法递归匹配子包中的类,将其修改为<include within="in.xxx..*"/>(包名后加两个点),才能覆盖所有应用包下的类,包括你的Service类和切面类。
  • 校验切点配置正确性:确认切面中@Around注解里写的x.y.z.TrackTime是你自定义@TrackTime注解的全限定类名,包名、类名写错会直接导致切点匹配失败。
  • 移除切面类上多余的注解:删掉TrackTimeServiceImpl类上的@Configuration注解。AspectJ加载时织入的切面不需要被Spring识别为配置类或托管Bean,加了@Configuration后该类会被Spring CGLIB代理,反而会导致切面逻辑无法正常织入目标类。
  • 调整JVM启动参数顺序:将aspectjweaver对应的-javaagent参数放在spring-instrument参数之前,JVM会按参数声明顺序加载javaagent,aspectjweaver需要优先加载才能完成后续的字节码修改操作。
  • 增加织入日志排查类加载问题:在启动参数中追加如下参数,启动时即可看到具体的类织入日志,确认目标类是否被成功织入:
-Dorg.aspectj.weaver.showWeaveInfo=true
-Dorg.aspectj.tracing.enabled=true

如果启动日志中没有出现SomeService类被织入、b()方法匹配切面的相关记录,需要检查Jetty的类加载器配置,确认应用类没有被Jetty的父类加载器隔离导致aspectjweaver无法访问到类字节码。

修复完成后不需要做任何自注入、Scope配置,AspectJ会直接在类加载阶段修改目标类的字节码,无论方法是外部调用还是类内部this调用,都会被切面拦截。

内容的提问来源于stack exchange,提问作者Karthik S Jhingade

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:27:14