单身豆在两种情况下春天

时间:2013-10-25 08:36:41

标签: spring web-services spring-mvc

我在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>

2 个答案:

答案 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。