SpringMVC的启动流程

SpringMVC的启动是建立在Servlet容器之上的,所有web工程的初始位置就是web.xml,它配置了servlet的上下文(context)、过滤器(Filter)和监听器(Listener)。Spring的启动流程其实就是Ioc容器的启动过程。一个WEB项目在Servlet容器中启动的时候会根据web.xml的配置执行对应的方法,因此Spring的启动流程可以选择配置在web.xml的Servlet或者Filter或者Listener上。不管是以何种方式启动容器,过程一般就是三步:

  • 创建一个WebApplicationContext

  • 配置并刷新Bean

  • 将容器初始化到Servlet上下文中

使用Servlet控制容器的初始化

SpringMVC提供了DispatcherServlet来在容器启动的时候对Spring进行初始化,

<servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>
    org.springframework.web.servlet.DispatcherServlet
  </servlet-class>
  <!-- 表示启动容器时初始化此Servelt,调用init方法 -->
  <load-on-startup>1</load-on-startup>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:springmvc.xml</param-value>
  </init-param>
</servlet>
<servlet-mapping>
  <servlet-name>springmvc</servlet-name>  <!-- 需要和上面的servlet-name保持一致 -->
  <url-pattern>/</url-pattern> <!-- url的匹配规则,/ 就是匹配所有 -->
</servlet-mapping>

因为配置了 <load-on-startup>1</load-on-startup>,所以在容器启动的时候会调用Servlet的init方法,追踪代码,可以看到是在DispatcherServlet的父类的父类HttpServletBean中实现了init方法。在init方法里对Spring容器进行了初始化操作。

使用Listener进行初始化

在web.xml中配置Listener来进行容器的初始化。

ContextLoaderListener实现了ServletContextListener的contextInitialized方法,所以在容器启动的时候会调用此方法,在此方法里面实现Spring容器的初始化。在contextInitialized中,通过调用父类(ContextLoader)的initWebApplicationContext方法进行容器创建:

下面来看initWebApplicationContext的代码:

下面我们在看下createWebApplicationContext方法是如何创建WebApplicationContext的

最后来看下determineContextClass这个方法:

参考:

https://juejin.im/post/59a286866fb9a0249d616fbb

Last updated

Was this helpful?