防止重复aop代理

时间:2014-04-23 07:09:47

标签: java spring aop

我有一只耳朵有两个模块:module1和module2。每个模块都有自己的应用程序上下文。它们的上下文中的两个模块都导入相同的aop:

<aop:config>
    <aop:pointcut id="convertExceptionPointcut"
                  expression="@within(services.annotations.Manager)"/>
    <aop:aspect ref="convertExceptionAdvice" order="100">
        <aop:around method="around" pointcut-ref="convertExceptionPointcut"/>
    </aop:aspect>
</aop:config>

<bean id="convertExceptionAdvice" class="error.ConvertExceptionAdvice"/>   

问题是来自两个模块的类在运行时都有重复的aop代理 - 一个来自module1 aop,第二个来自module2 aop。

我的web.xml:

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>appContext-module1.xml, appContext-module2.xml</param-value>
</context-param>

<!-- JAX-WS servlet -->
<servlet>
    <servlet-name>jaxws-servlet</servlet-name>
    <servlet-class>com.sun.xml.ws.transport.http.servlet.WSSpringServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>jaxws-servlet</servlet-name>
    <url-pattern>/ws/*</url-pattern>
</servlet-mapping>

Spring只创建一个导入appContext-module1.xml和appContext-module2.xml的上下文。

当我在两个上下文中使用相同的id时,相同的bean会在将上下文组合在一起时弹出,只导入一个bean - 对于bean工作重写。 对于aop,当我使用相同的id时,它会创建两个代理,因此aop proxy加倍。来自module1的所有aops也转到module2,而来自module2的所有aops也转到module1。

是否有某种方法可以覆盖aops,所以它不会加倍?

我认为可以工作的另一个解决方案是为每个模块创建两个独立的上下文。是否可以在web.xml中定义两个ContextLoaderListener?

0 个答案:

没有答案