我有一个关于 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.java和Test.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
请问,有什么想法吗?
谢谢!