我有一个由两个子项目组成的项目,这两个子项目都是 Spring 项目,并且每个子项目都有一个 applicationContext.xml 。
一种是框架项目(最终作为 JAR),另一种是实际应用程序(最终作为 WAR 并依赖于 JAR,并将 JAR 的 applicationContext.xml 导入到它自己的 applicationContext.xml 中)。
在框架项目中,我为所有公共方法定义了一个方面。
@Aspect
@Configurable
public class MyAspect {
@Autowired
private SomeBean mBean;
@Pointcut("execution(public * *(..))")
public void anyPublicMethod() {
}
@Before("anyPublicMethod()")
public void checkAuthorization(JoinPoint pJoinPoint) {
mBean.doSomething();
}
}
我已经在框架的applicationContext.xml中激活了AOP(它是由实际应用程序项目的applicationContext.xml导入的)。
...
<context:spring-configured />
<context:component-scan base-package="com.mypackage" />
<aop:aspectj-autoproxy/>
...
在框架项目中进行测试时,在调用 Spring bean 上的公共方法时,方面会按预期执行。
如上所述,框架项目作为依赖项包含在应用程序项目中,但在任何 Spring bean 上的应用程序项目中调用匹配方法(任何公共方法)时,不会执行该方面。
我还尝试过使用该方面的 XML 配置。这会导致相同的行为。
恕我直言,您可以稍微调整一下方法。
我要做的第一件事是将战争的应用程序上下文的配置委托给 web.xml :
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/classes/spring*.xml</param-value>
</context-param>
其次,我将在您的 war 文件的应用程序上下文中启用 aop,因为这是您想要使用它的地方。目前看来,您正在使用 aop 配置导入应用程序上下文,只是为了将其放入您的 Web 项目中,这可能是错误的。
最后,我假设这些是运行时而不是编译方面,在后一种情况下,无论依赖关系如何,您都需要在您的战争项目中使用aspectj重新编译。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)