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

时间:2014-01-18 14:00:45

标签: spring gradle aspectj spring-aop

我是Gradle / AspectJ的新手,我对此有几个问题。 我开发了一些将在其他项目中使用的库。我使用AspectJ来实现一些交叉逻辑,我使用@Aspect创建了我的方面而没有apectj特定语言。 这个lib是一个小框架,它提供了一些使用它的注释。 我为我的课程创建了单元测试。我知道应用方面我需要使用AspectJ编译器(“ajc”)编译类。在我的ide中,我使用选项运行测试:-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版本?也许有人遇到过这种情况并有任何想法,所以请给我建议。谢谢你的进步。

1 个答案:

答案 0 :(得分:0)

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等一起使用。