Spring整合AspectJ加载时织入:Advice未执行求助
排查Spring中AspectJ加载时织入(LTW)Advice未执行问题
在Spring环境下使用AspectJ加载时织入(Load Time Weaving)方式,但Advice始终未触发,已配置@EnableLoadTimeWeaving、指定spring-instrument Java Agent并创建aop.xml,日志显示织入进程在运行但无效果。以下是具体排查思路:
相关代码与配置回顾
Aspect类
@Aspect public class ProfilingAspect { @Around("methodsToBeProfiled()") public Object profile(ProceedingJoinPoint pjp) throws Throwable { System.out.println("Hello #################"); return pjp.proceed(); } @Pointcut("execution(public * com.core.search.domain.AIESearchDomainService.doSearch())") public void methodsToBeProfiled() { } }
目标服务类
package com.core.search.domain; public class AIESearchDomainService { public SearchResponse doSearch() { return null; } }
关键配置
- 启用LTW:
@EnableLoadTimeWeaving(需添加在Spring配置类上) - JVM参数:
-javaagent:"pathTo/spring-instrument-5.3.25.jar" resources/META-INF/aop.xml:
<aspectj> <weaver> <include within="com.core.search.domain.*"/> </weaver> <aspects> <aspect name="package.for.ProfilingAspect"/> </aspects> </aspectj>
排查步骤
修正aop.xml中Aspect的全类名
当前aop.xml里的package.for.ProfilingAspect是占位符,必须替换为ProfilingAspect的实际全类名(比如com.core.search.aspect.ProfilingAspect),否则AspectJ无法定位到切面类。验证Pointcut表达式准确性
- 检查目标方法签名是否完全匹配:确认
doSearch()无参数、返回值类型与表达式一致,若存在重载方法需调整表达式覆盖目标方法。 - 测试宽泛表达式缩小范围:临时将Pointcut改为
execution(* com.core.search.domain..*(..)),若能触发Advice,说明原表达式存在匹配问题,再逐步精准定位。
- 检查目标方法签名是否完全匹配:确认
确认织入范围与类加载器一致性
- 检查
aop.xml的weaver配置:com.core.search.domain.*仅匹配当前包下类,若目标类在子包需改为com.core.search.domain..*;同时确保Aspect类所在包也被织入(可添加<include within="com.core.search.aspect.*"/>)。 - 验证类加载器:目标类与Aspect类需由同一个类加载器加载,可通过
-verbose:class查看类加载日志,确认两者加载器一致。
- 检查
确保Aspect被Spring管理
给ProfilingAspect添加@Component注解,或在Spring配置类中手动注册为Bean,确保Spring能识别并加载该切面。校验Java Agent有效性
- 版本匹配:
spring-instrument的版本需与Spring核心版本(5.3.25)完全一致。 - 路径正确性:确认
-javaagent参数中的jar路径无拼写错误,路径含空格时需用引号包裹。 - 验证Agent加载:添加
-verbose:class参数,查看org.springframework.instrument.InstrumentationSavingAgent是否被加载。
- 版本匹配:
开启AspectJ调试日志
添加JVM参数:-Dorg.aspectj.weaver.showWeaveInfo=true -Dorg.aspectj.debug=true通过日志可查看:哪些类被织入、Pointcut是否匹配到目标方法、Aspect是否被成功加载,直接定位织入失败的具体环节。
确认目标对象创建时机
若目标对象是通过new关键字直接实例化,需确保类在织入完成后再创建对象;若由Spring容器管理,需保证容器启动时织入已完成(Spring LTW默认会在容器启动时触发织入)。
内容的提问来源于stack exchange,提问作者Rushil Ahuja
相关产品推荐
相关产品推荐

