java - Spring AOP : Aspect triggering when configuration is in Servlet context, 但不是应用程序上下文?

标签 java spring spring-mvc aspectj spring-aop

我正在使用 Spring 3.0.x 和 Spring AOP。

所以,我有以下看点:

@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 /> 时在我的应用程序上下文中,没有触发切入点/方面。 但是,如果我放置<aop:aspectj-autoproxy />在我的 servlet 配置中,一切正常,一切正常。

为什么我的上述设置适用于 <aop:aspectj-autoproxy />在 servlet 上下文中,但不在应用程序上下文中???

编辑:

以下是相关的 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>

最佳答案

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

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

关于java - Spring AOP : Aspect triggering when configuration is in Servlet context, 但不是应用程序上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6144239/

相关文章:

database - Spring Framework 中的默认隔离级别

spring - hibernate 5 命名策略配置

java - Spring Boot 无法解析 View

java - 无法在 Spring Boot 中拦截和操作 HttpServletResponse

java - 使用 Redis 的 Spring 启动 session 中出现错误 - 没有 [...SessionRepository] ​​类型的合格 bean

Java - 删除字符串中连续的重复标签

Java StringTokenizer 和存储数组

java - 无法让 Spring MVC 3.2.4 使用 UrlBasedViewResolver 为 jsp 提供服务

java - 动态创建对象并运行 BFS

java - 使用 java 的 radio /碟式套接字 (ZeroMQ)