我正在按照描述在 Spring 中试验 AspectJ 加载时编织 here .我已经检查了 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 个连接点来编织它。但是如果我替换 execution(..)
与 call(..)
在 PerformanceAdvice 的连接点并再次运行 maven,输出不包含最后两行,并且不执行建议。 AspectJ 跟踪包含大量日志语句,但我无法理解其中的意义。我扫描了它是否有错误或警告,但一无所获。
(我假设我应该能够简单地将 execution(..)
替换为 call(..)
,因为它们的语法在 AspectJ programming guide 中分别描述为 execution(MethodPattern)
和 call(MethodPattern)
)。
我也尝试使用更新版本的 AspectJ (1.6.6),但无济于事。
最佳答案
调用指示符应该与您的切入点一起使用。
你的调用类在weaver元素指定的包里吗?
<weaver>
<!-- only weave classes in this package -->
<include within="org.springbyexample.aspectjLoadTimeWeaving.*" />
</weaver>
如果调用类和执行类在不同的包中并且它与执行一起工作,则修复 aop.xml 文件或重构您的调用类以在给定的包中。
关于java - 使用方法调用切入点在 Spring 中进行 AspectJ 加载时编织?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3097134/