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?