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

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

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

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

谢谢!

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

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

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

FrameworkServlet.createWebApplicationContext

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

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

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

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

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

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