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

Spring启动编译时编织和Spring AOP/Run time编织(代理)在同一个项目中

阴宏爽
2023-03-14
@Aspect
@Component
public class TestAspect {
  // ...
}
<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>aspectj-maven-plugin</artifactId>
  <version>1.11</version>
  <executions>
    <execution>
      <goals>
        <goal>compile</goal>       <!-- use this goal to weave all your main classes -->
        <goal>test-compile</goal>  <!-- use this goal to weave all your test classes -->
      </goals>
    </execution>
  </executions>
</plugin>

这意味着我们正在使用编译时编织。

哪一个优先?使用的是编译时编织,还是代理?

共有1个答案

梁兴文
2023-03-14

嗯,你为什么不试试?那不是比问还快吗?好的,以下是我的想法:

  • AspectJ完全独立于Spring AOP或Spring。您可以在没有Spring的情况下使用它,也可以在Spring应用程序中使用它,通常是通过加载时编织(LTW)。Spring手册解释了如何配置。
  • 如果使用LTW,Spring会注意到它,这可能是因为您通过Spring选项显式地配置了它,也可能只是因为Spring以某种方式检测到活动的编织代理。无论哪种方式,只要LTW处于活动状态,Spring就会停用它自己的Spring aop。
  • 关于编译时编织(CTW),Spring并不知道它,因为它发生在构建时,甚至在Spring启动之前。根据您使用哪种AspectJ特性,AspectJ增强类看起来可能与常规Java类没有什么不同,例如对于简单的ITD字段或方法定义。然而,在大多数情况下,修改是这样的,您需要类路径上的AspectJ运行时库AspectJrt.jar。如果是这种情况,应用程序应该正常运行,不管有没有Spring.
  • 在Spring的情况下,我不希望它注意到您以前使用过CTW。因此,它不会停用Spring AOP。您应该能够将两者结合使用。只需确保不要将本机方面声明为Spring组件,否则Spring AOP将尝试重新应用它。结果将是不可预测的。但是普通的Spring AOP方面组件应该能够正常工作。当然,您还需要确保AspectJ Maven不会意外地将Spring AOP方面编译为本机方面。您可以通过将AspectJ方面放入另一个模块中,创建一个方面库,然后通过 配置在AspectJ Maven中引用它来实现这一点。

底线:您不能混合使用Spring AOP和AspectJ LTW,但应该能够使用Spring AOP+AspectJ CTW。你只是应该有充分的理由这样做,并理解你在做什么。

 类似资料:
  • 但我的问题是,如果它不使用AspectJ进行编织,那么Spring AOP是否有自己的编织,它是在加载时还是编译时执行? 我的Spring配置XML文件的相关部分是:

  • 是否有可能拥有一个Scala Maven项目,并在Scala类中编译时编织AspectJ方面? 我已经能够使加载时编织工作,但到目前为止没有成功的编译时。

  • 问题内容: 我有一个当前可与Java 6一起使用并编译时间编织的项目。我们使用以下pom启用spring方面以及我们自己的方面: 我尝试了各种配置,但是不能使其与Java 7一起使用。如果有人可以共享工作的pom或导致它,那将是很好的。 问题答案: 升级到Aspectjtools的1.7.0版后,它可以正常工作。另外,您需要将版本参数传递给编译器(使用该参数会导致问题)。如果有人需要更多详细信息,

  • 我从Spring Initializr下载了一个spring-boot空项目,编译时它给我以下错误: 我已经尝试了jdk 8和12,看起来它并没有改变什么。 这是我的pom.xml 我已经在这里阅读了所有类似的主题,但我的问题不同。我必须使用Maven,但还没有添加任何插件。

  • 我有一个使用编译时编织方面的项目,它依赖于两个外部JAR。我从https://github.com/eveoh/gradle-aspectj使用gradle-aspectj插件 按以下方式生成.分级: 我的项目基于intellij idea(16)+gradle(2.12)+spring boot(1.2.3) 任何帮助都将不胜感激。 ===============================

  • 问题内容: 更新5: 我已经基于最新的Eclipse下载了最新的Spring ToolsSuite IDE。当我将项目导入为Maven项目时,Eclipse / STS似乎使用Maven目标来构建我的项目。这意味着AspectJ最终可以在Eclipse中正常工作。 更新4: 我最终仅使用Maven + AspectJ插件进行编译时编织,有效地绕过Eclipse的机制。 更新3: 看来AspectJ