当前位置: 首页 > 知识库问答 >
问题:

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

仲孙毅
2023-03-14

我是Gradle/AspectJ的新手,对此我有几个问题。我开发了一些库,将在其他项目中使用。我使用AspectJ实现了一些交叉逻辑,并且使用@Aspect创建了我的方面,而没有使用apectj特定的语言。这个lib是一个小框架,它提供了一些注释来使用它。我为我的类创建了单元测试。我知道要应用方面,我需要使用AspectJ编译器(“AJC”)编译类。在我的ide中,我使用option:-javaagent:[path to aspectjweaver jar]运行测试,并且我的所有测试都运行得很好。但是当我从gradle运行测试时,有些测试失败了,因为我的方面没有应用。我在maven中听说了aspectj插件,并试图为Gradle找到类似的东西。我找到了一个插件,它将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的使用是否影响到项目中已经存在的其他方面?也许有一种方法可以说gradle只在测试时挥动方面,而让项目的开发人员负责以适当的方式编译方面?或者更好地为spring Framework创建单独的lib版本?也许有人遇到这样的情况,有什么想法,所以请给我建议。谢谢你的提前通知。

共有1个答案

姚自强
2023-03-14

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));
    }

我猜您应该提供纯acpects(仅由javac编译的java类),让其他人有机会根据需要编译它。但是我建议您为所有可能的用例创建测试:将您的lib与spring aop、acpectj、guice aop等一起使用。

 类似资料:
  • 本文向大家介绍使用coffeescript编写node.js项目的方法汇总,包括了使用coffeescript编写node.js项目的方法汇总的使用技巧和注意事项,需要的朋友参考一下 Node.js 基于JavaScript编写应用,JavaScript是我的主要开发语言。CoffeeScript是编译为JavaScript的编程语言。其实CoffeeScript语言因其可以一对一的翻译为Java

  • 不过,我真正想要的是不要用一打子项目。sbt文件污染我的根。是否有一种方法可以将子项目build.sbt文件抛到它们各自的子目录中,在它们之间共享一些公共代码,然后为聚合子项目的整个项目创建一个根build.sbt?我现在在。Scala文件中有类似的设置,但如果可能的话,我更喜欢使用。sbt文件。 如果这是不可能的,那么用。sbt文件构建大型多项目构建的“正确”方法是什么?

  • 本文向大家介绍使用devenv在命令行中编译项目的方法,包括了使用devenv在命令行中编译项目的方法的使用技巧和注意事项,需要的朋友参考一下 本文介绍如何使用命令行运行Visual Studio编译项目。 一、devenv介绍 devenv是VisualStudio的可执行程序,一般在“..\Microsoft Visual Studio 12.0\Common7\IDE”下,用于运行Visua

  • 实际上,这将是一个更复杂的问题。我只想在测试中使用AspectJ。找到了使用if()连接点和一些静态布尔字段的建议。此外,首先我开始使用aspect作为我的基本测试方法的内部静态类。经过一些实验,我把它换成了自己的班级,但实际上并没有得到我想要的结果。所以,我只是创建了一些测试项目。Maven pom。xml: 类别:A: B: 测试类: Aspect类 主要类别: 运行测试和主要方法后我得到了结

  • 我是一个新的bee-to-Spring框架,我指的是Spring项目中可用的文档。 在这个过程中,我还学习了一个新概念AOP。我遵循spring文档来尝试一些示例http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html 我尝试使用Spring AOP为我的第一个Aspect Hellowor

  • 问题内容: 我已经在Eclipse IDE中创建了一个Aspectj项目,但是我需要使用Maven来构建它。 我有maven-aspectj插件,但不知道如何使用它。 问题答案: 以下是我执行此步骤的步骤。这给了我编译时的编织。如果您需要其他策略,显然您需要其他方法(例如用于运行时AOP代理的Spring AOP )。 添加一个属性以标准化您使用的AspectJ版本: 添加运行时依赖项: 添加As