【发布时间】:2010-06-22 21:04:12
【问题描述】:
如here 所述,我正在Spring 中试验AspectJ 加载时编织。我查看了sample code,它的工作原理与宣传的一样。
但是当我尝试将PerformanceAdvice 的切入点从execution(..) 更改为call(..) 语义时,建议不再执行。
我知道 Spring AOP 不支持 call(..) 语义,但这不应该适用于这里,因为我使用的是 AspectJ LTW(示例代码成功地适用于非 Spring 管理的对象)。
谁能解释一下?
更新: 为了确认 LTW 有效,我在 argline 配置中添加了以下系统属性 pom.xml:
-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 programming guide 中分别描述为execution(MethodPattern) 和call(MethodPattern)。
我也尝试使用更新版本的 AspectJ (1.6.6),但无济于事。
【问题讨论】: