在其他JAR中定义时,不会执行Spring Aspect

tob*_*yer 6 spring aspectj spring-aop

我有一个由两个子项目组成的项目,这两个子项目都是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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经在框架的applicationContext.xml中激活了AOP(由实际应用程序项目的applicationContext.xml导入).

...
    <context:spring-configured />

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

    <aop:aspectj-autoproxy/>
...
Run Code Online (Sandbox Code Playgroud)

在框架项目中进行测试时,在Spring bean上调用公共方法时,方面会按预期执行.

如上所述,框架项目作为依赖项包含在应用程序项目中,但在任何Spring bean上调用应用程序项目中的匹配方法(任何公共)时,不会执行该方面.

我也尝试过使用方面的XML配置.这导致了同样的行为.

Mik*_*tel 4

恕我直言,您可以稍微调整一下方法。

我要做的第一件事是将战争的应用程序上下文的配置委托给 web.xml :

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>WEB-INF/classes/spring*.xml</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)

其次,我将在您的 war 文件的应用程序上下文中启用 aop,因为这是您想要使用它的地方。目前看来,您正在使用 aop 配置导入应用程序上下文,只是为了将其放入您的 Web 项目中,这可能是错误的。

最后,我假设这些是运行时而不是编译方面,在后一种情况下,无论依赖关系如何,您都需要在您的战争项目中使用aspectj重新编译。