Spring启动都做了些什么? - Gukie/interview GitHub Wiki

1. ServletContext

每个WEB应用程序,都对应一个ServletContext, 它为后面的IOC容器提供宿主环境

2. Spring 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

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>

3. Servlet的初始化

  • 启动好 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);
}

4. Bean的共享与私有

每一个Servlet都有自己的上下文,也有自己独立的Bean,同时还公用者Spring IOC容器(WebApplicationContext)中的Bean


refer:

  1. http://blog.csdn.net/moshenglv/article/details/53517343
  2. http://tinylcy.me/2016/06/21/Spring-IoC-Context%E5%90%AF%E5%8A%A8%E8%BF%87%E7%A8%8B%E8%A7%A3%E6%9E%90/
⚠️ **GitHub.com Fallback** ⚠️