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

Posted

技术标签:

【中文标题】为啥 Spring MVC 至少需要两个上下文?【英文标题】:Why does Spring MVC need at least two contexts?为什么 Spring MVC 至少需要两个上下文? 【发布时间】:2013-09-12 00:18:06 【问题描述】:

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

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

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

谢谢!

【问题讨论】:

【参考方案1】:

查看这个答案About multiple containers in spring framework

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

为了代码重用,最好在应用程序上下文中隔离服务,而不是在 WebApplicationContext 中。但这不是强制的。你可以只保留 webApplicationcontext。

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

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

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

FrameworkServlet.createWebApplicationContext

【讨论】:

以上是关于为啥 Spring MVC 至少需要两个上下文?的主要内容,如果未能解决你的问题,请参考以下文章

Spring:MVC启动时的WebApplicationContext的关系

为啥用spring mvc 注解的方式跳转到controller就是跳不过去,是啥原因呢

ssm整合为啥要写两个spring配置文件?写在一个里面不行吗?

如何在 Spring MVC 中模拟安全上下文以进行测试

为啥@JavaConfig 在 Spring MVC 中不起作用?

spring mvc源码长按ctrl键为啥不跳转