Spring:为什么“根”应用程序上下文和“servlet”应用程序上下文是由不同的各方创建的?
据我所知,基于Spring的Web应用程序初始化如下:
步骤 1:找到 的实现,即 。Servlet container (e.g. Tomcat)
ServletContainerInitializer
SpringServletContainerInitializer
步骤 2:创建和SpringServletContainerInitializer
DispatcherServlet
ContextLoaderListener
步骤3:创建.并创建.DispatcherServlet
servlet application context
ContextLoaderListener
root application context
步骤 1 由 Servlet 3.0 规范定义。步骤2,3完全由Spring定义。
我可以看到将bean放在servlet上下文中而将bean放在根上下文中的合理性。但是为什么我们必须在不同的地方创建这两个上下文,即 和?web
non-web
DispatcherServlet
ContextLoaderListener
如果我们想要的只是准备所有必要的东西,为什么不直接创建两个上下文,因为它可以被视为整个Web应用程序的方法。我认为这更符合逻辑,目前的方法只会使事情复杂化。ContextLoaderListener
main()
添加 1
根据@Shailendra的回答,我画了这个:
我的理解是,Spring引入了这些概念并将其存储在.Servlet Context是由java servlet technolgoy引入的概念。application context
Servlet Context
我想实现应该有一个成员变量来保持它在.因此,它可以访问自己的上下文。也许关键是 servlet 名称。DispatcherServlet
key
servlet application context
servlet context
并且应该有一个众所周知的密钥,以便每个人都可以访问它。root application context
添加 2
众所周知的关键是:root application context
(在org.springframework.web.context.WebApplicationContext
)
String ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE = WebApplicationContext.class.getName() + ".ROOT";
添加 3
确实有对其 的引用。它从 继承以下成员:DispatcherServlet
WebApplicationContext
FrameworkServlet
/** WebApplicationContext for this servlet */
private WebApplicationContext webApplicationContext;
和
public FrameworkServlet(WebApplicationContext webApplicationContext) {
this.webApplicationContext = webApplicationContext;
}