Spring启动都做了些什么? - Gukie/interview GitHub Wiki
每个WEB应用程序,都对应一个ServletContext, 它为后面的IOC容器提供宿主环境
- 2.1. web容器启动的过程,会被 web.xml文件中配置的 ContextLoaderListener 监听到
- 2.2. ContextLoaderListener 监听到之后,会调用 contextInitialized
- 2.3. contextInitialized 方法中,主要做的事情,是初始化一个 Spring的启动上下文,即WebApplicationContext
- 2.4. WebApplicationContext是一个接口,实际的实现是 XmlWebApplicationContext,它其实就是Spring的IOC容器了
- 2.5. XmlWebApplicationContext 中存储的Bean,是有 web.xml 中的 context-param 配置的文件指定的
- 2.6. Spring IOC 容器启动好之后,WebApplicationContext 会以 WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE 为Key的形式存储到 ServletContext中,方便后面的 Context 获取
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
-
启动好 Spring IOC之后,接下来就是配置 web.xml文件中的Servlet,其中最主要的是 DispatcherServlet 了 DispatcherServlet,其实是一个 Spring MVC 的IOC容器,里面的bean都是Spring MVC 相关的Bean
-
初始化的时候,会先通过 WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE 获取 Spring IOC的容器,然后以它为自己的parent,有了parent之后,再进行自己的初始化
-
初始化的code如下
protected void initStrategies(ApplicationContext context) {
this.initMultipartResolver(context);
this.initLocaleResolver(context);
this.initThemeResolver(context);
this.initHandlerMappings(context);
this.initHandlerAdapters(context);
this.initHandlerExceptionResolvers(context);
this.initRequestToViewNameTranslator(context);
this.initViewResolvers(context);
this.initFlashMapManager(context);
}
每一个Servlet都有自己的上下文,也有自己独立的Bean,同时还公用者Spring IOC容器(WebApplicationContext)中的Bean
refer: