2

我有一个关于 Spring AOP 和 AspectJ 的问题,用注释定义方面、切入点等。

上下文是这样的:

  • 我有 2 个 Maven 模块(A 和 B)。
  • 模块 B 使用模块 A(通过<dependency>...</dependency>在 maven 中)并导入他的 spring 上下文。
  • 我正在尝试编写和使用一个非常愚蠢的测试方面(捕获所有公共操作)。
  • 这方面在模块 A 中定义,
  • 当我在 A 或 B 中调用任何公共操作时,我不希望这方面起作用。

好吧,现在是“后精神”。我的第一个方法是在 XML 中定义所有内容。方面,切入点等。而且效果非常好。这是代码:

应用程序上下文

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd   http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd   http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<aop:config>
    <aop:aspect id="myAspectAOP" ref="myAspect">
        <aop:around method="validateCall"
            pointcut="execution(public * *(..))" />
    </aop:aspect>
</aop:config>
<context:component-scan base-package="com.mypackage"/>      

</beans>

MyAspect.javaTest.java与下一个 case 相同(没有 Aspect 注释)。我还没有把它放在这里以避免传播太多文字。

这很好用!

好的,下一个方法。使用注释。这是代码:

应用程序上下文

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd   http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd   http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

    <aop:aspectj-autoproxy />
    <context:component-scan base-package="com.mypackage"/>      
</beans>

MyAspect

@Aspect
@Component //I have tried without this annotation, and it doesn't work
public class MyAspect {

    @Pointcut("execution(public * *(..))")
    public void allPublic() {
    }

    @Around("allPublic()")
    public Object validateCall(final ProceedingJoinPoint proceedingJoinPoint) throws Throwable {

    // Some Code

    }
}

Test.java(包 com.mypackage)

@Component
public class Test{
    public void foo(){
    //Some code
    }
}

在这种情况下:

  • 当我将Test.java放入模块 B并调用公共操作(请记住,类在 B 模块中)时,它不起作用
  • 但是当我将Test.java放入A 模块并调用公共操作(它在 A 模块中)时,它可以工作。它看起来仅适用于对定义到定义 Aspect 的同一模块(A 模块)中的类的公共操作的调用,但不适用于“外部”(B 模块)。记住。B 模块包含/使用 A 模块并导入他的上下文。但是当我使用“xml 声明”而不是“注释声明”时它不会发生
  • 重要提示:MyAspect.java始终位于A 模块中

请记住,在第一种情况下(在 applicationContext 中定义 all,而不使用 @Aspect @Pointcut,@...)在 B 和 A 模块公共操作中始终有效。

在这两种情况下,类都在com.mypackage中,因此由 spring 注入。

我真的迷路了,这是我第一次得到这种“后遗症”,而且我几天来一直在谷歌上寻找和研究 Spring 文档,但我找不到任何解决方案。

我正在使用 Spring 3.1.2 和 Aspectj 1.6.11

请问,有什么想法吗?

谢谢!

4

0 回答 0