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

2022-09-04 22:54:06

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

步骤 1:找到 的实现,即 。Servlet container (e.g. Tomcat)ServletContainerInitializerSpringServletContainerInitializer

步骤 2:创建和SpringServletContainerInitializerDispatcherServletContextLoaderListener

步骤3:创建.并创建.DispatcherServletservlet application contextContextLoaderListenerroot application context

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

我可以看到将bean放在servlet上下文中而将bean放在根上下文中的合理性。但是为什么我们必须在不同的地方创建这两个上下文,即 和?webnon-webDispatcherServletContextLoaderListener

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

添加 1

根据@Shailendra的回答,我画了这个:

enter image description here

我的理解是,Spring引入了这些概念并将其存储在.Servlet Context是由java servlet technolgoy引入的概念。application contextServlet Context

我想实现应该有一个成员变量来保持它在.因此,它可以访问自己的上下文。也许关键是 servlet 名称。DispatcherServletkeyservlet application contextservlet context

并且应该有一个众所周知的密钥,以便每个人都可以访问它。root application context

添加 2

众所周知的关键是:root application context

(在org.springframework.web.context.WebApplicationContext)

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

添加 3

确实有对其 的引用。它从 继承以下成员:DispatcherServletWebApplicationContextFrameworkServlet

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

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

答案 1

但是为什么我们必须在不同的地方创建这两个上下文,即DispmenterServlet和ContextLoaderListener。

因为这两个上下文应该是不同的,但又具有层次结构关系,以便能够覆盖。通常,使用加载的上下文是属于整个应用程序的“根”上下文,而使用初始化的上下文实际上是特定于该 servlet 的。从技术上讲,您可以在一个应用程序中拥有多个 servlet,因此多个这样的上下文,每个上下文都特定于各自的 servlet,但具有相同的根上下文。有关更多详细信息,请参阅我的另一个答案 请点击此处。.ContextLoaderListenerDispatcherServlet


答案 2

推荐