spring mvc的启动,是跟随着tomcat启动的,所以要深入理解spring mvc的启动过程与原理,需要先了解下tomcat启动的一些关键过程。
1、tomcat web应用启动及初始化过程
参考官方文档,tomcat web应用启动过程是这样的:
图1 tomcat web应用启动过程
大概意思就是,当一个Web应用部署到容器内时,在web应用开始执行用户请求前,会依次执行以下步骤:
-
部署描述文件web.xml中<listener>元素标记的事件监听器会被创建和初始化;
-
对于所有事件监听器,如果实现了ServletContextListener接口,将会执行其实现的contextInitialized()方法;
-
部署描述文件中由<filter>元素标记的过滤器会被创建和初始化,并调用其init()方法;
-
部署描述文件中由<servlet>元素标记的servlet会根据<load-on-startup>的权值按顺序创建和初始化,并调用其init()方法;
通过上述文档的描述,可知tomcat web应用启动初始化流程是这样的:
图2 tomcat web应用初始化过程
可以看出,在tomcat web应用的初始化流程是,先初始化listener,接着初始化filter,最后初始化servlet。
2、spring mvc应用的启动初始化
做过spring mvc项目开发的伙伴,都会配置一个web.xml配置文件,内容一般是这样的:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <!--全局变量配置--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:spring/spring-main.xml </param-value> </context-param> <!--监听器--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> <!--解决乱码问题的filter--> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- MVC Servlet --> <servlet> <servlet-name>springServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:spring/spring-mvc*.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
web.xml配置文件中也主要是配置了Listener,Filter,Servlet。