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

标签 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 个连接点来编织它。但是如果我替换 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/

相关文章:

java - 如何从 Spring/JPA/Hibernate 中的嵌套实体获取对象?

java - 即使表单字段留空,也会提交空字符串并在 Spring 中创建新实体

java - 具有多个注释的方法的 AspectJ 切入点

java - AspectJ-使用if()表达式的切入点导致无限递归

java - Spring 加载时间编织不检测用@configurable注释的类

java - 寻求有关 JVM 随机崩溃的帮助

java - 任何使用 ActiveMQ 多播的人

java - TwoDArrayWritable 中的行列值

java - 每个测试用例设置的 WireMock 在第二次测试时挂起

java - Heroku 无法检测到构建包 - Spring Boot