使用方法调用切入点在Spring中进行AspectJ加载时编织?

时间:2010-06-22 21:04:13

标签: java spring aspectj

我正在试验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个连接点来编织它。但是如果我在PerformanceAdvice的连接点中用execution(..)替换call(..)并再次运行maven,那么输出不包含最后2行,并且不执行建议。 AspectJ跟踪包含许多日志语句,但我无法理解它。我扫描了它是否有错误或警告,但没有找到。

(我假设我应该只能将execution(..)替换为call(..),因为AspectJ programming guide的语法分别在{{3}}中被execution(MethodPattern)call(MethodPattern)描述})。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

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

-javaagent:lib/aspectjweaver.jar

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