Spring AOP:当配置在Servlet上下文中而不是应用程序上下文时,Aspect触发?

时间:2011-05-26 19:51:54

标签: java spring spring-mvc aspectj spring-aop

我正在使用带有Spring AOP的Spring 3.0.x.

所以,我有以下方面:

@Aspect
public class TestAspect {
    @Pointcut(value="@annotation(Bar)", argNames="Bar")
    public void pointCutMethod(Bar bar)
    {
    }

    @Before(value="pointCutMethod(Bar)", argNames="Bar")
    public void wrapPublishMethod(Bar bar) throws Throwable
    {
        // Do something crazy
    }
}

我有以下课程和方法:

public class Foo {
    @Bar
    public void doSomething() {
        // do another thing
    }
}

现在,这是我的应用程序上下文(没有我的AOP配置):

<bean id="testAspect" class="org.xyz.TestAspect" />
<bean id="foo" class="org.xyz.Foo" />

我正在尝试使用以下声明连接我的方面:

<aop:aspectj-autoproxy />

当我在我的应用程序上下文中放置<aop:aspectj-autoproxy />时,切入点/方面不会被触发。 但是,如果我在我的servlet配置中放置<aop:aspectj-autoproxy />,一切都很顺利,一切正常。

为什么我的上述设置在servlet上下文中与<aop:aspectj-autoproxy />一起使用,但在应用程序上下文中却没有?

修改

以下是相关的web.xml行:

 <servlet>
    <servlet-name>XYZ</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
                <!-- Aspect works when config line is in this file -->
        <param-value>/WEB-INF/classes/xyz-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<context-param>
    <param-name>contextConfigLocation</param-name>
        <!-- Aspect DOES NOT work when config line is in one of the files below -->
    <param-value>/WEB-INF/classes/xyz-application-context.xml, /WEB-INF/classes/xyz-aspectConfig.xml</param-value>
</context-param>

1 个答案:

答案 0 :(得分:1)

servlet上下文参数旨在由ContextLoaderListener读取(如果在web.xml中定义),而不是FrameworkServlet(或其衍生词,如{{1} }})。

DispatcherServlet将从指定为servlet上下文参数的配置位置创建根应用程序上下文(所有servlet应用程序上下文的父级)。如果servlet也会读取它,那么将在servlet应用程序上下文中重新定义相同的bean,而不是仅仅从父app-ctx继承它们。