我有一个使用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仍然可以看到它?
答案 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文档:
一条周围的建议控制是否优先级较低的建议 将通过调用继续运行。继续调用将运行建议 具有下一个优先级,或者如果存在则在连接点下的计算 没有进一步的建议。
之前的建议可以阻止低优先级的建议 通过抛出异常来运行。但是,如果它正常返回, 那么下一个优先权的建议,或者下面的计算 如果没有进一步的建议,加入品脱,将会运行。