Java 防止复制aop代理
我有一只耳朵,它有两个模块:模块1和模块2。每个模块都有自己的应用程序上下文。两个模块在其上下文中导入相同的aop:Java 防止复制aop代理,java,spring,aop,Java,Spring,Aop,我有一只耳朵,它有两个模块:模块1和模块2。每个模块都有自己的应用程序上下文。两个模块在其上下文中导入相同的aop: <aop:config> <aop:pointcut id="convertExceptionPointcut" expression="@within(services.annotations.Manager)"/> <aop:aspect ref="convertExceptionAdvice"
<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
My 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时,当spring将上下文放在一起时,只导入一个bean-for bean覆盖。
对于aop,当我使用相同的ID时,它会创建两个代理,所以aop代理会加倍。模块1中的所有AOP也会转到模块2,模块2中的所有AOP也会转到模块1
是否有某种方法可以覆盖AOP,这样就不会加倍
另一个我认为可行的解决方案是为每个模块创建两个独立的上下文。可以在web.xml中定义两个ContextLoaderListener吗?您可以尝试给定义id属性,告诉Spring它是同一个方面,这应该与使用id的其他bean的工作方式相同。如果这能奏效,那只是一个快速的解决办法。我不确定您编写应用程序的意图是什么,模块之间的依赖关系是什么,但在我看来,您在一个合并的spring上下文中使用具有相同ID的相同bean进行配置有点奇怪。您应该重新考虑如何编写spring配置。我已经为此创建了一个。