0

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

2 回答 2

2

如果我正确理解您的问题,那么您有一个 Web 应用程序上下文(例如*-servlet.xml)和一个根应用程序上下文(例如applicationContext.xml)。Web 应用程序上下文扩展了应用程序上下文,因此它可以从父级访问 bean,但不能反过来,因此需要在两者中访问的 bean 应该在applicationContext.xml

看:

编辑:

在您的 web.xml 中,您有两个 ServletContext,但没有根上下文。Spring MVC 中 ApplicationContext 和 WebApplicationContext 有什么区别?对此有很好的解释,但简而言之,您需要通过将以下内容添加到 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 加载根应用程序上下文。根应用程序上下文中的 Bean 可以在两个 ServletContext 中访问。您通常只需要 ServletContexts 中与 Web 相关的 bean(控制器等),并在根应用程序上下文中共享业务逻辑。

于 2013-10-25T09:51:45.257 回答
1

如果 bean 需要在两个不同的上下文中使用,则在单独的应用程序上下文 xml 文件中定义它,然后创建三个应用程序上下文:

根上下文 - 包含共享 bean

应用程序上下文 1. 例如网络应用程序。具有作为父级的根上下文。应用上下文 2. 例如 web 服务接口,也有根上下文作为父级。

当创建根应用程序上下文时,bean 将被实例化一次。然后,两个子应用程序上下文都可以使用该单例 bean。

于 2013-10-25T08:47:15.483 回答