【问题标题】:AspectJ Load-time Weaving in Spring with method-call pointcuts?使用方法调用切入点在 Spring 中进行 AspectJ 加载时编织?
【发布时间】: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),但无济于事。

【问题讨论】:

    标签: java spring aspectj


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的评论。我仔细检查了 AspectJ 是否真正起作用,并相应地更新了我的问题。
    • 是这个包中调用Processor.process()的(测试)类:org.springbyexample.aspectjLoadTimeWeaving?
    • 是的,请参阅下面的 URL 获取源代码。如果不是,我想 AspectJ 也不会与“执行”切入点一起工作。 svn.springbyexample.org/core/aspectj-load-time-weaving/tags/1.0/…
    • 不,使用调用指示符,您的测试类将被编织,而使用执行指示符,处理器类将被编织。 AJDT Eclipse plugin 在编辑器中用橙色箭头显示切入点,非常有帮助!
    • 您当然是对的,谢谢。 AJDT 是个好主意,我会试试看。
    【解决方案2】:

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

    -javaagent:lib/aspectjweaver.jar
    

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

    【讨论】:

    猜你喜欢
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    相关资源
    最近更新 更多