22

在 Spring MVC 中,有两种上下文。一种是应用程序上下文或全局上下文,由ContextLoaderListener. contextConfigLocation它需要参数中提到的所有配置文件。

现在,如果您也使用 Spring MVC,则需要 Dispatcher servlet,它会启动另一个容器,该容器也称为 Web 应用程序容器。此容器将全局容器作为父容器。

在将 struts1 与 spring 集成时,只有一个上下文。为什么spring mvc需要两个?使用spring mvc时是否可以只使用一个上下文?

谢谢!

4

3 回答 3

17

拥有一个根 Web 应用程序上下文和一个子 servlet 上下文只是一种选择。如果您知道您的应用程序不会有第二个 servlet,那么为整个 Web 应用程序拥有一个单一的 Spring 上下文可能会更简单。

您可以通过简单地从您的移除ContextLoaderListener(和随附的contextConfigLocation上下文参数)web.xml并将所有 bean 定义移动到定义 servlet 上下文 ( [servlet-name]-servlet.xml) 的 xml 中来实现该设置。

这是可能的,因为FrameworkServlet(的超类DispatcherServlet)在创建 servlet 上下文时并不关心是否存在根应用程序上下文。如果可用,它只是将根上下文作为父级中继。在此处查看相关代码

于 2013-09-08T17:16:07.933 回答
14

想象一下,您有两个独立的 Dispatcher,每个都有不同的用途,并且每个都有自己的依赖项。您将使用单独的上下文独立配置它们。

如果有任何共享配置,这可以在“全局”上下文中进行。

我认为使用 DispatcherServlet 不可能只有一个上下文,因为它会创建自己的上下文并将其链接到父上下文(通过 FrameworkServlet 超类)。

FrameworkServlet.createWebApplicationContext

于 2013-09-08T13:35:41.200 回答
5

检查这个答案关于spring框架中的多个容器

是的,你只能有一个上下文。

对于代码重用,最好在 Application Context 中隔离服务而不是 WebApplicationContext。但这不是强制的。您只能保留 webApplicationcontext。

于 2013-09-09T12:36:44.270 回答