需要在AspectJ项目中配置Spring AOP建议

时间:2014-07-16 13:55:10

标签: java spring maven aspectj spring-aop

我有一个使用AspectJ的Spring项目。在99.9%的案例中,使用AspectJ(ajc)来CTW我的方面正如预期的那样工作。

然而,在一个特定的情况下,我发现我需要围绕Spring方面编织我的方面。更具体地说,我想包装一个Spring @Transactional。

如果我使用AspectJ ajc来CTW我的建议,它将围绕任何定义为@Transactional的方法编织它。相反,我想包装Spring @Transactional建议。基本上,我试图捕获事务中抛出的任何错误,如果失败则重试事务。

我的问题是,通过在项目的其余部分使用ajc,它会自动将我的方面编织到我的类中,而不是允许Spring的AOP机制解释它并在运行时编织它。

我的项目正在使用aspectj-maven-plugin。如何配置我的pom /项目,以便ajc忽略我的@Aspect,但Spring仍然可以看到它?

1 个答案:

答案 0 :(得分:1)

  

我的项目正在使用aspectj-maven-plugin。我如何配置我的   pom / project让ajc忽略了我的@Aspect,但Spring仍然看到了   它?

不要包含Spring方面库。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>aspectj-maven-plugin</artifactId>
    <version>1.5</version>
    <configuration>
        <complianceLevel>${project.javaVersion}</complianceLevel>
        <encoding>UTF-8</encoding>
        <aspectLibraries>
            <!-- remove this -->
            <aspectLibrary>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
            </aspectLibrary>
        </aspectLibraries>

编译时编织和运行时基于代理的AOP可能比它的价值更麻烦,并且可能引入其他问题。让你的方面和标准Sping方面建议使用@Transactional方法不应该是一个问题。如果我是你,我会坚持使用编译时编织和set the precedence在你的方面,以便它首先运行。在您的方面,您可以捕获异常并根据需要重试。

来自AspectJ文档:

  

一条周围的建议控制是否优先级较低的建议   将通过调用继续运行。继续调用将运行建议   具有下一个优先级,或者如果存在则在连接点下的计算   没有进一步的建议。

     

之前的建议可以阻止低优先级的建议   通过抛出异常来运行。但是,如果它正常返回,   那么下一个优先权的建议,或者下面的计算   如果没有进一步的建议,加入品脱,将会运行。