当前位置: 首页 > 知识库问答 >
问题:

Spring:为什么“根”应用上下文和“servlet”应用上下文由不同的方创建?

公冶高义
2023-03-14

据我所知,基于Spring的web应用程序初始化如下:

步骤1:Servlet容器(例如Tomcat)定位Servlet容器初始化器的实现,即Spring容器初始化器

步骤2:< code > SpringServletContainerInitializer 创建< code>DispatcherServlet和< code > context loader listener

第3步:DispatcherServlet创建servlet应用程序上下文ContextLoaderListener创建根应用程序上下文

步骤 1 由 Servlet 3.0 规范定义。步骤2,3完全由Spring定义

我可以看到将webbean放在servlet上下文中,将非webbean放在根上下文中的合理性。但是为什么我们必须在不同的地方创建这两个上下文,即DispatcherServletContextLoaderListener

如果我们只想准备所有必要的东西,为什么不在ContextLoaderListener中创建这两个上下文,因为它可以被视为整个web应用程序的main()。我认为这更符合逻辑,目前的方法只会使事情复杂化。

根据@Shailendra的回复,我得出以下结论:

我的理解是,Spring引入了应用程序上下文概念并将它们存储在Servlet Context中。Servlet Context是java servlet Technolgoy引入的概念。

我猜< code>DispatcherServlet实现应该有一个成员变量来保存< code>servlet上下文中其< code>servlet应用程序上下文的< code >键。因此它可以访问自己的上下文。也许关键是servlet名称。

而<code>根应用程序上下文

根应用程序上下文的已知键是这样的:

(在组织Spring框架工作,网站上下文,网络应用程序上下文中

String ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE = WebApplicationContext.class.getName() + ".ROOT";

调度程序服务器确实引用了其 Web 应用程序上下文。它从框架服务包中继承以下成员:

/** WebApplicationContext for this servlet */
private WebApplicationContext webApplicationContext;

public FrameworkServlet(WebApplicationContext webApplicationContext) {
    this.webApplicationContext = webApplicationContext;
}

共有1个答案

狄凯
2023-03-14

但是,为什么我们必须在不同的地方创建这两个上下文,即调度程序Servlet和上下文加载程序侦听器

因为这两个上下文应该是不同的,但是仍然具有层次关系以便能够覆盖。通常,使用< code > context loader listener 加载的上下文是属于整个应用程序的“根”上下文,而使用< code>DispatcherServlet初始化的上下文实际上是特定于该Servlet的。从技术上来说,一个应用程序中可以有多个servlet,因此可以有多个这样的上下文,每个特定于各自的servlet,但具有相同的根上下文。要了解更多细节,请看我的另一个回答。

 类似资料:
  • 我知道我需要在servlet上下文中注册用注释的类,以使webapp可访问。通常,我会按照以下方式来做: 我添加到根应用程序上下文中的所有其他配置类。下面是我的dispatcher初始值设定项通常的样子: 但是当我开始使用WebSockets时,事情变得更有趣了。要使websockets工作,必须将WebSoketConfig.class放到servlet上下文中。下面是我的WebSocketCo

  • 我正在阅读spring framework文档,现在我正在讨论应用程序范围概念。关于这个概念的文档是这样说的: 这有点类似于Spring单例bean,但有两个重要的区别:它是每个ServletContext的单例,而不是每个Spring ApplicationContext的单例 对我来说,不清楚的是我们如何想象Spring应用程序上下文和Servlet上下文之间的关系。 那么,Spring应用程

  • 我正在学习Spring MVC,我有一些相关的疑问 因此,我有这个配置类来配置处理用户请求的DispatcherServlet: 3)根据我的理解,在dispatcherContext中定义的bean可以访问在rootContext中定义的bean(但相反的情况并非如此)。为什么? TNX

  • 0.9 新版功能. Flask 背后的设计理念之一就是,代码在执行时会处于两种不同的“状态”(states)。 当 Flask 对象被实例化后在模块层次上应用便开始隐式地处于应用配置状 态。一直到第一个请求还是到达这种状态才隐式地结束。当应用处于这个状态的时候 ,你可以认为下面的假设是成立的: 程序员可以安全地修改应用对象 目前还没有处理任何请求 你必须得有一个指向应用对象的引用来修改它。不会有某

  • 我多年来一直在使用Spring MVC,我试图理解与Spring Boot的一些关键区别。 你能帮我确认一下吗?或者让我明白我在这里遗漏了什么?

  • 问题内容: 我正在研究 Spring MVC ,所以我有一些疑问 因此,我有这个配置类,用于配置处理用户请求的 DispatcherServlet : 我很清楚 DispatcherServlet的 工作方式。我的怀疑与 上下文 概念有关。 1)确切表示 上下文 ?我认为这就像一组具有特定用途的豆类,可以在环境中工作。但是我绝对不正确。 2) 根上下文 和 调度程序servlet上下文有 什么区别