4

我正在按照此处所述在 Spring 中尝试 AspectJ Load-time Weaving 。我已经检查了示例代码,它可以像宣传的那样工作。

但是,当我尝试将PerformanceAdvice的切入点从语义execution(..)更改为时call(..),建议不再执行。

我知道 Spring AOP 不支持call(..)语义,但这不应该适用于这里,因为我使用的是 AspectJ LTW(示例代码成功地与非 Spring 管理的对象一起使用)。

任何人都可以解释一下吗?

更新: 为了确认 LTW 有效,我在 pom.xml 的 argline 配置中添加了以下系统属性:

  • -Dorg.aspectj.weaver.showWeaveInfo=true
  • -Daj.weaving.verbose=true
  • -Dorg.aspectj.tracing.enabled=true
  • -Dorg.aspectj.tracing.factory=default
  • -Dorg.aspectj.tracing.file=/tmp/aspectj-trace.txt

现在运行的输出mvn test包含以下几行:

[AppClassLoader] info AspectJ Weaver Version 1.5.3 built on Wednesday Nov 22, 2006 at 11:18:15 GMT
[AppClassLoader] info register classloader sun.misc.Launcher$AppClassLoader@5acac268
[AppClassLoader] info using configuration 
    /private/tmp/aspectj-load-time-weaving/target/test-classes/META-INF/aop.xml
[AppClassLoader] info register aspect org.springbyexample.aspectjLoadTimeWeaving.PerformanceAdvice
[AppClassLoader] weaveinfo Join point 
    'method-execution(void org.springbyexample.aspectjLoadTimeWeaving.Processor.process())' 
    in Type 'org.springbyexample.aspectjLoadTimeWeaving.Processor' (Processor.java:38) 
    advised by around advice from 
    'org.springbyexample.aspectjLoadTimeWeaving.PerformanceAdvice' (PerformanceAdvice.java)
[AppClassLoader] weaveinfo Join point 
    'method-execution(void org.springbyexample.aspectjLoadTimeWeaving.
        PerformanceAdvice.aspectjLoadTimeWeavingExamples())' 
    in Type 'org.springbyexample.aspectjLoadTimeWeaving.PerformanceAdvice' (PerformanceAdvice.java:37)
    advised by around advice from 
    'org.springbyexample.aspectjLoadTimeWeaving.PerformanceAdvice' (PerformanceAdvice.java)

所以看起来 AspectJ 已经拿起了 PerformanceAdvice 并找到了 2 个连接点来编织它。但是如果我在 PerformanceAdvice 的连接点中替换execution(..)call(..)并再次运行 maven,输出不包含最后两行,并且建议不是执行。AspectJ 跟踪包含许多日志语句,但我无法理解它。我扫描了它是否有错误或警告,但没有发现。

(我假设我应该能够简单地替换execution(..)为,call(..)因为它们的语法分别在AspectJ 编程指南中进行了描述)。execution(MethodPattern)call(MethodPattern)

我还尝试使用更新版本的 AspectJ (1.6.6),但无济于事。

4

2 回答 2

2

调用指示符应该与您的切入点一起使用。

您的调用类是否在 weaver 元素中指定的包中?

<weaver>
        <!-- only weave classes in this package -->
        <include within="org.springbyexample.aspectjLoadTimeWeaving.*" />
</weaver>

如果调用和执行类位于不同的包中并且它与执行一起工作,则修复 aop.xml 文件或重构您的调用类以位于给定包中。

于 2010-06-22T22:06:37.847 回答
0

您使用的是实际的 aspectJ 代理吗?就像在运行时传递给你的 JRE

-javaagent:lib/aspectjweaver.jar

我发现这是我能够获得 aspectJ AOP 而不是 spring AOP 的唯一方法

于 2010-06-22T21:22:22.710 回答