外部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
相关产品推荐
相关产品推荐

