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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:31:02