java - 为什么 AspectJ 不编译 Spring 的 @Configurable 工作?

标签 java maven aop spring-aop compile-time-weaving

更新 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>

我真的很担心我重复了 this problem , 一切工作不一致。随着我了解更多信息,我会不断更新这个问题。

关于 Eclipse,我取得了一些进展,将我希望编织的二进制方面(在本例中为 spring-aspects.jar)复制到我的类路径中。然后我将这个现在的外部 jar 添加到我的 Aspect Path 中。完成此操作后,Eclipse 会在我的代码中正确显示 AspectJ 标记。令人讨厌的是,我不能将 spring-aspects.jar 留在我的 Java Build Path 中,该路径由 Maven 通过 Maven 插件为我维护。但是,出于某种原因,AspectJ 插件看不到二进制方面,除非它们被显式添加到 Aspect Path


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

我之前在加载时编织中使用了这个注释,它大部分都有效。有时我会启动并且不会注入(inject)任何东西。这个问题催生了this StackOverflow question .答案不多,但大多数人建议我尝试编译时编织,因为可靠性更高。

我为 Eclipse 和 Maven 安装了 AspectJ 插件。这两者都产生似乎是正确编译的类。在 AspectJ 编译之前,我在文本编辑器中打开了其中一个类,但没有发现对 AspectJ 的引用。我在 AspectJ 编译后打开它,Eclipse 和 Maven 生成的版本都引用了 org.aspectj.weaver.MethodDeclarationLineNumber。这就是为什么我认为它被正确编译的原因。问题是一旦部署,就不会注入(inject)任何依赖项。

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

    <context:spring-configured />

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

以上是标记为@Configurable 的类完成DI 所需要的吗?在从加载时编织到编译时编织的转换过程中,我从我的applicationContext.xml,以及来 self 的 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>

关于java - 为什么 AspectJ 不编译 Spring 的 @Configurable 工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/901632/

相关文章:

java - Spring - 使用 TransactionManager

java - 从 servlet 读取资源文件

java - 无法在 Spring Mavenized 元素中加载 CSS

caSTLe-windsor - CaSTLe Windsor Interceptor for private/protected 方法

java - AspectJ 与 SpringAOP 的 Aspect 不起作用

java - 在浏览器中获取 PDF 格式的响应

java - 在 Liferay 计划作业中创建 Assets 类别

java - 如何在开发和部署之间设置不同的文件路径?

java - 通过在maven java项目中引用parent来拉取模块的依赖关系?

spring - 如何在没有接口(interface)的情况下使用加载时间编织配置 AspectJ