Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 防止复制aop代理_Java_Spring_Aop - Fatal编程技术网

Java 防止复制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"

我有一只耳朵,它有两个模块:模块1和模块2。每个模块都有自己的应用程序上下文。两个模块在其上下文中导入相同的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

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配置。我已经为此创建了一个。