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

外部Jar中抽象类重写方法的@Before Advice未执行问题

无法通过AspectJ拦截Cassandra QueryLogger的update方法

我最近在尝试为抽象类com.datastax.driver.core.QueryLogger的update(Host, Statement, Exception, long)方法创建@Before通知——这个抽象类实现了com.datastax.driver.core.LatencyTracker接口并覆写了update方法,但始终无法让Aspect类生效,具体细节如下:

我的配置与代码

1. aop.xml配置

路径:src\main\resources\META-INF\aop.xml

<aspectj>
    <weaver>
        <include within="com.datastax.driver.core.*"/>
        <include within="com.xxx.offline.aop.CassandraMetricsAspect"/>
    </weaver>
    <aspects>
        <aspect name="com.xxx.offline.aop.CassandraMetricsAspect"/>
    </aspects>
</aspectj>

2. Aspect实现类

@Aspect
@Component
public class CassandraMetricsAspect implements Serializable {

    private static final long serialVersionUID = -4731145870765590889L;

    private static final Logger LOGGER = LoggerFactory.getLogger();

    @Before("execution(* com.datastax.driver.core.QueryLogger.update(..))")
    public void logBefore(JoinPoint joinPoint) {
        Object[] signatureArgs = joinPoint.getArgs();
        LOGGER.info("Classname " + joinPoint.getClass());
        for (Object signatureArg : signatureArgs) {
            LOGGER.info("Arg: " + signatureArg);
        }
    }
}

3. Maven依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-instrument</artifactId>
    <version>4.3.11-RELEASE</version>
</dependency>

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.8.11</version>
</dependency>

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>1.8.11</version>
</dependency>

4. Eclipse运行参数

我在运行配置中添加了JavaAgent参数:

-javaagent:"I:\cig-maven-repo\org\springframework\spring-instrument\4.3.12.RELEASE\spring-instrument-4.3.12.RELEASE.jar"

遇到的问题

不管怎么调整,我的Aspect类都没有执行过。我试过以下几种切点表达式,全部无效:

  • execution(* *.*(..)):完全拦截不到QueryLogger的update方法
  • execution(* com.datastax.driver.core.LatencyTracker+.update(..))
  • execution(* com.datastax.driver.core.QueryLogger.update(..))

后续排查的更新信息

更新1

开启AspectJ详细日志后,我发现实际被织入的方法是com.datastax.driver.core.QueryLogger$ConstantThresholdQueryLogger$$EnhancerBySpringCGLIB$$xxx.update(..),而我的Aspect指定的是com.datastax.driver.core.QueryLogger.update(..),是不是因为这个签名差异导致拦截失败?

更新2

我的配置类已经启用了Load-Time Weaving,而且项目里Spring Batch等模块也引入了Spring AOP依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:21:02