我正在尝试像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),但无济于事。

    最佳答案

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

    您的调用类是否在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/

    10-12 22:37