Spring AOP 在 Maven 多模块环境中不起作用

发布于 2024-12-04 01:29:13 字数 1953 浏览 0 评论 0 原文

我有一个基于 Spring 3 构建的 java 应用程序。

我的方面 ConsumerAspect.java 位于名为 Aspect 的单独 Maven 模块中。它有之前的通知和切入点,如下所示:

@Before("execution(* handle(..)) && args(inMessage,..)")

handle() 方法位于名为 Endpoint 的不同 Maven 模块中名为 EndpointListener.java 的不同类中。

我正在使用加载时编织,我的 aop.xml 如下所示:

<aspectj>
    <weaver options="-verbose">
        <!-- only weave classes in our application-specific packages -->
        <include within="com.sabre.svm.ods.app.*"/>
        <include within="com.sabre.svm.producer.messaging.*"/>
    </weaver>
    <aspects>
        <!-- weave in just this aspect -->        
        <aspect name="com.sabre.svm.ods.app.OdsConsumer"/>
    </aspects>
</aspectj>

如上所述,weaver 元素中的第一个包含内容是方面,weaver 元素中的第二个包含内容指向包含以下内容的包: EndpointListener.java

我的 spring applicationContext.xml 文件包含

<context:load-time-weaver aspectj-weaving="on"/>
<bean id="odsConsumerAspect" class="com.sabre.svm.ods.app.OdsConsumer">
</bean>

Aspect 模块的 pom.xml 中,我使用了以下插件:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <forkMode>once</forkMode>
        <argLine>
            -javaagent:C:/spring-agent-2.5.6.jar
        </argLine>
        <useSystemClassloader>true</useSystemClassloader>
    </configuration>
</plugin>

最后我添加了Aspect 模块作为 Endpoint 模块 pom 文件中的依赖项。

现在,当我执行应用程序时,handle 方法不会被拦截。

当我将所有文件保存在同一个模块中时,它就可以工作。

我无法理解为什么它不起作用。有人可以透露一些信息吗?

I have a java application build upon Spring 3.

My aspect ConsumerAspect.java is in separate maven module called Aspect. It has before advice and the pointcut like:

@Before("execution(* handle(..)) && args(inMessage,..)")

And the handle() method is in a different class called EndpointListener.java in a different maven module called Endpoint.

I am using load time weaving and my aop.xml looks like:

<aspectj>
    <weaver options="-verbose">
        <!-- only weave classes in our application-specific packages -->
        <include within="com.sabre.svm.ods.app.*"/>
        <include within="com.sabre.svm.producer.messaging.*"/>
    </weaver>
    <aspects>
        <!-- weave in just this aspect -->        
        <aspect name="com.sabre.svm.ods.app.OdsConsumer"/>
    </aspects>
</aspectj>

As stated above, the first include in the weaver element is the aspect and the second include in the weaver element points to the package which contains the EndpointListener.java.

My spring applicationContext.xml file contains

<context:load-time-weaver aspectj-weaving="on"/>
<bean id="odsConsumerAspect" class="com.sabre.svm.ods.app.OdsConsumer">
</bean>

In the pom.xml of the Aspect module i have used the following plugin:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <forkMode>once</forkMode>
        <argLine>
            -javaagent:C:/spring-agent-2.5.6.jar
        </argLine>
        <useSystemClassloader>true</useSystemClassloader>
    </configuration>
</plugin>

And lastly I have added the Aspect module as dependency in Endpoint module pom file.

Now when I execute the application, the handle method is not getting intercepted.

When I keep all the files in the same module it works.

I am not able to understand why it's not working. Can some one shed some light.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文