为什么Spring MVC需要至少两个上下文?

时间:2013-09-08 10:03:30

标签: java spring servlets spring-mvc

在Spring MVC中,有两种情况。一个是由ContextLoaderListener启动的应用程序上下文或全局上下文。它采用contextConfigLocation参数中提到的所有配置文件。

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

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

谢谢!

3 个答案:

答案 0 :(得分:15)

拥有根Web应用程序上下文和子servlet上下文只是一个选项。如果您知道您的应用程序没有第二个servlet,那么为整个Web应用程序提供一个Spring上下文就更简单了。

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

这是可能的,因为FrameworkServletDispatcherServlet的超类)在创建servlet上下文时不关心是否存在根应用程序上下文。它只是将根上下文作为父级传递(如果可用)。请参阅related code here

答案 1 :(得分:12)

想象一下,你有两个独立的Dispatchers,每个Dispatchers都有不同的用途,每个都有自己的依赖关系。您可以使用单独的上下文独立配置它们。

如果有任何共享配置,则可以进入“全局”上下文。

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

FrameworkServlet.createWebApplicationContext

答案 2 :(得分:5)

检查此答案About multiple containers in spring framework

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

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