我在Web应用程序中有一个Web应用程序上下文(用于DISPATCHER)和Web服务上下文(用于MESSAGE DISPATCHER)。 我有一个单独的bean,我在两种情况下都需要这个bean。 如果我在两个上下文中将bean指定为单例,则它不再是单例。 请提出解决方案或指导我正确的方向。
<servlet>
<servlet-name>ws</servlet-name>
<servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
<init-param>
<param-name>transformWsdlLocations</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ws</servlet-name>
<url-pattern>/service/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
答案 0 :(得分:2)
如果我正确理解您的问题,您就拥有了一个Web应用程序上下文(例如*-servlet.xml
)和一个根应用程序上下文(例如applicationContext.xml
)。 Web应用程序上下文扩展了应用程序上下文,因此它可以从父级访问bean,而不是相反,因此需要在两者中访问的bean应该在applicationContext.xml
请参阅:
编辑:
在您的web.xml中,您有两个ServletContexts,但没有根上下文。 What is the difference between ApplicationContext and WebApplicationContext in Spring MVC?的答案对此有一个很好的解释,但简而言之,您需要通过将以下内容添加到web.xml来加载根应用程序上下文:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:META-INF/spring/applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
然后将从applicationContext.xml加载根应用程序上下文。可以在两个ServletContexts中访问根应用程序上下文中的Bean。您通常只需要ServletContexts中的Web相关bean(控制器等),以及根应用程序上下文中的共享业务逻辑。
答案 1 :(得分:1)
如果bean需要在两个不同的上下文中使用,请在单独的应用程序上下文xml文件中定义它,然后创建三个应用程序上下文:
根上下文 - 包含共享bean
应用环境1.例如网络应用。将根上下文作为父级。 应用环境2.例如Web服务接口,也将根上下文作为父级。
创建根应用程序上下文时,将对bean进行一次实例化。然后,子应用程序上下文都可以使用该单例bean。