Spring AOP: запуск аспекта, когда конфигурация находится в контексте сервлета, но не в контексте приложения? - PullRequest
2 голосов
/ 26 мая 2011

Я использую 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 /> в конфигурацию моего сервлета, все будет хорошо, и все будет работать.

Почему мои настройки выше работают с <aop:aspectj-autoproxy /> в контексте сервлета, но не в контексте приложения ???

EDIT:

Вот соответствующие строки 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 Ответ

1 голос
/ 27 мая 2011

Параметр контекста сервлета предназначен для чтения ContextLoaderListener (если это определено в вашем web.xml), а не FrameworkServlet (или его производными, такими как DispatcherServlet).

ContextLoaderListener создаст корневой контекст приложения (родительский для всех контекстов приложения сервлета) из расположений конфигурации, указанных в качестве параметра контекста сервлета. Если сервлеты тоже будут это читать, те же бины будут переопределены в контексте приложения сервлета, а не просто унаследованы от родительского app-ctx.

...