Java 为什么SpringMVC至少需要两个上下文?

Java 为什么SpringMVC至少需要两个上下文?,java,spring,servlets,spring-mvc,Java,Spring,Servlets,Spring Mvc,在SpringMVC中,有两种上下文。一个是由ContextLoaderListener启动的应用程序上下文或全局上下文。它接受contextConfigLocation参数中提到的所有配置文件 现在,如果您也在使用SpringMVC,那么就需要DispatcherServlet,这将启动另一个容器,也称为web应用程序容器。此容器将全局容器作为父容器 将struts1与spring集成时,只有一个上下文。为什么SpringMVC需要两个?在使用SpringMVC时,是否可以只使用一个上下文 谢

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

现在,如果您也在使用SpringMVC,那么就需要DispatcherServlet,这将启动另一个容器,也称为web应用程序容器。此容器将全局容器作为父容器

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


谢谢

假设您有两个独立的Dispatcher,每个Dispatcher服务于不同的目的,并且每个Dispatcher都有自己的依赖项。您可以使用单独的上下文独立地配置它们

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

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


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

您只需从
web.xml
中删除
ContextLoaderListener
(以及附带的
contextConfigLocation
context参数),并将所有bean定义移动到定义servlet上下文的xml中(
[servlet name]-servlet.xml

这是可能的,因为创建servlet上下文时,
FrameworkServlet
(DispatcherServlet的超类)不关心是否存在根应用程序上下文。它只是将根上下文中继为父上下文(如果可用)。请参阅。

检查此答案

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

对于代码重用,最好在应用程序上下文中隔离服务,而不是WebApplicationContext。但这不是强制要求。您只能保留WebApplicationContext