gpt4 book ai didi

spring - 在使用Spring AOP的项目中使用用AspectJ编写的方面

转载 作者:行者123 更新时间:2023-12-03 06:23:08 26 4
gpt4 key购买 nike

我是Gradle / AspectJ的新手,对此我有几个问题。
我开发了一些将在其他项目中使用的库。我使用AspectJ来实现一些跨 Realm 逻辑,并且使用@Aspect创建了我的方面,而没有使用apectj特定语言。
这个lib是一个小型框架,提供了一些使用它的注释。
我为类(class)创建了单元测试。我知道要应用方面,我需要使用AspectJ编译器(“ajc”)来编译类。在我的想法中,我使用以下选项运行测试:-javaagent:[aspectjweaver jar的路径],并且我所有的测试都运行正常,并且很值得期待。但是,当我从gradle运行测试时,由于未应用我的方面,因此某些测试失败了。我听说过Maven中的AspectJ插件,并试图为gradle找到类似的东西。我发现了这个plugin,它将AspectJ方面编织到了类中,并且效果很好,所有测试都通过了,但是我遇到了一些问题。我怎么说我开发了在其他项目中使用的第三方库,如果某些项目使用Spring AOP,那么我的方面将无法正常工作。例如,方面不适用于下一个配置:

<aop:aspectj-autoproxy/>
<bean id="myAspect" class="com.ext.aop.MyAspect"/>

为了清楚起见,我的方面以某种逻辑包装了所有用我的特定批注进行批注的方法。

在加载时编织的情况下,我的各个方面都在工作:
<context:load-time-weaver aspectj-weaving="autodetect"/>
-javaagent:lib/spring-instrument.jar

也许有人知道出什么问题了?我对LTW的理解是,项目开发人员需要再次使用一些插件来编译项目,以表达敬意。 LTW的使用是否会影响项目中已经存在的其他方面?也许有一种方法可以说只摇动测试方面而让项目的开发人员负责以适当的方式编译方面?还是最好为Spring框架创建单独的lib版本?也许有人遇到过这种情况并且有任何想法,所以请给我建议。感谢前进。

最佳答案

Spring AOP无法处理由ajc编译的方面,这是AbstractAspectJAdvisorFactory源代码的片段:

    /**
* We consider something to be an AspectJ aspect suitable for use by the Spring AOP system
* if it has the @Aspect annotation, and was not compiled by ajc. The reason for this latter test
* is that aspects written in the code-style (AspectJ language) also have the annotation present
* when compiled by ajc with the -1.5 flag, yet they cannot be consumed by Spring AOP.
*/
public boolean isAspect(Class<?> clazz) {
return (hasAspectAnnotation(clazz) && !compiledByAjc(clazz));
}

我想您应该提供纯粹的尊重(仅由javac编译的java类),以便其他人有机会根据需要对其进行编译。但我建议您为所有可能的用例创建测试:将lib与spring aop,acpectj,guice aop等一起使用。

关于spring - 在使用Spring AOP的项目中使用用AspectJ编写的方面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21205114/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com