当前位置: 首页 > 面试题库 >

为什么AspectJ不会在Spring的@Configurable工作中进行编译时编织?

孟光耀
2023-03-14
问题内容

更新5: 我已经基于最新的Eclipse下载了最新的Spring ToolsSuite IDE。当我将项目导入为Maven项目时,Eclipse /
STS似乎使用Maven目标来构建我的项目。这意味着AspectJ最终可以在Eclipse中正常工作。

更新4: 我最终仅使用Maven + AspectJ插件进行编译时编织,有效地绕过Eclipse的机制。

更新3:
看来AspectJ的Eclipse插件破坏了Eclipse正确发布到Tomcat的能力。只有删除项目上的AspectJ功能,我才能使它再次正确发布。很烦人。

更新2:
我现在可以在Eclipse中使用它。这么说让我感到非常不舒服,但是我不知道如何从Eclipse或Maven构建中使用它。它似乎是编译问题,而不是运行时问题。

更新1: 看来我已经通过Maven构建实现了这一点,但是我不知道如何实现。Eclipse仍然无法正常工作。我在 pom.xml中所做
的唯一更改是添加了这些(无关紧要的?)配置参数:

<source>1.6</source>
<complianceLevel>1.6</complianceLevel>
<verbose>true</verbose>
<showWeaveInfo>true</showWeaveInfo>
<outxml>true</outxml>

我真的很担心我会重复出现这个问题,在此情况下一切工作都不一致。当我了解更多信息时,我将不断更新此问题。

关于Eclipse,我取得了一些进展,采用了我希望编织的二进制方面(在本例中为 spring-aspects.jar
)并将其复制到类路径之外。然后,我将此外部jar添加到我的 Aspect Path中
。完成此操作后,Eclipse在我的代码中正确显示了AspectJ标记。这很烦人,我不能离开 spring-aspects.jar中 的我的
Java构建路径 是由Maven的,我通过的Maven插件维护。但是,由于某些原因,AspectJ插件不会看到二进制方面,除非将它们明确地添加到
Aspect Path中

原始帖子:
@Configurable是Spring注释,它允许将依赖项注入到Spring外部实例化的对象中(例如,通过Hibernate或某些Factory类)。

我以前在加载时编织中使用了此注释,并且 _大多数情况下都_有效。有时,我会启动并且什么也不会注入。但是大多数人建议我尝试使用编译时编织,以提高可靠性。

我为Eclipse和Maven安装了AspectJ插件。两者都产生看起来正确编译的类。在AspectJ编译之前,我已经在文本编辑器中打开了其中一个类,但没有找到对AspectJ的引用。我在AspectJ编译之后将其打开,并且Eclipse和Maven生成的版本都引用了
org.aspectj.weaver.MethodDeclarationLineNumber
。这就是为什么我假设它已正确编译的原因。问题在于,一旦html" target="_blank">部署,就不会注入依赖项。

我的Spring applicationContext.xml 确实包含以下内容:

    <context:spring-configured />

    <context:component-scan base-package="com.myapp" />

以上是标记为@Configurable的类完成DI所需的全部吗?在从加载时编织到编译时编织的转换过程中,我从
applicationContext.xml中 删除了 META-INF / aop.xml< context:load-time-weaver />,从 context.xml中 删除了Spring的Tomcat编织器。

我该如何进一步调查这个问题?有哪些可能的原因?


问题答案:

它使用编译时编织在maven上对我们有效,请尝试添加以下插件:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
    <compilerVersion>1.6</compilerVersion>
    <fork>true</fork>
    <source>1.6</source>
    <target>1.6</target>
</configuration>
</plugin>

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<executions>
    <execution>
        <id>compile</id>
        <configuration>
            <source>1.6</source>
            <target>1.6</target>
            <verbose>false</verbose>
            <outxml>true</outxml>
            <aspectLibraries>
                <aspectLibrary>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-aspects</artifactId>
                </aspectLibrary>
            </aspectLibraries>
        </configuration>
        <goals>
            <goal>compile</goal>
        </goals>
    </execution>
    <execution>
        <id>test-compile</id>
        <configuration>
            <source>1.6</source>
            <target>1.6</target>
            <verbose>false</verbose>
            <aspectLibraries>
                <aspectLibrary>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-aspects</artifactId>
                </aspectLibrary>
            </aspectLibraries>
        </configuration>
        <goals>
            <goal>test-compile</goal>
        </goals>
    </execution>
</executions>
<dependencies>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.6.4</version>
    </dependency>
</dependencies>
</plugin>

它作为两个独立的执行步骤完成,允许您添加不同的方面库以进行单元测试和编译。

您还需要为spring-aspects库添加以下依赖项:

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <scope>compile</scope>
    </dependency>


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

  • 问题内容: 我正在将项目从Java 7迁移到Java 8,而我遇到的问题与使用进行AspectJ编织有关。 根据Haus文档,我可以使用在Java 6和7上运行的此插件成功配置编织。但是问题是,我还没有找到使用(和找到)支持Java 8的插件版本7的任何方法。我在这里看到插件7添加了Java 8支持,但是找不到使用它的方法。 这是我需要的配置插件: 我确认上述使用1.6版的代码对于Java 7可以

  • 问题内容: 如果您有这样的程序: 注意两个输出语句之间写的URL 。 为什么程序编译时没有任何错误? 问题答案: 程序编译没有错误的原因是程序将其视为标签,这在Java中是允许的,并且通常与循环一起使用。 第二部分是,是的注释,因此被编译器忽略。 因此,它可以正确编译。

  • 发生在运行时,因为编译器不能在决定执行哪个函数,但为什么编译器不能在编译时决定呢? 产出: 狗在吃...

  • 问题内容: 遇到一个错误地使用 而不是 在其代码中的人,它没有显示为编译错误。 是因为 是相同的 ? 问题答案: 没有编译错误,因为它是有效的(尽管相当无用) 一元运算符 ,其使用方式与以下方式相同: Java语言规范中的相关部分是Unary Plus运算符+(第15.15.3节) 。它指定调用一元运算会导致操作数的一元数值提升(第5.6.1节)。这意味着: * 如果操作数是编译时类型的,,,或,

  • (这个问题与此密切相关,但它是一个更具体的问题,我希望能就此得到答案)