在Spring中, ContextLoaderListener只是辅助类,在web 容器启动的时候查找并建立WebApplicationContext对象,经过该对象进行加载spring的配置文件。而真正的逻辑实现实际上是在DispatcherServlet中进行的,DispatcherServlet是实现servlet接口的实现类。web
DispatcherServlet 在 web.xml 中的配置以下:spring
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern><!-- 若是写斜杠的话那就表示请求是否加后缀均可以 -->
</servlet-mapping>
DispatcherServlet 源码解析

DispatcherServlet 的 init() 方法在 HttpServletBean() 中实现的app
init()

- 解析DispatcherServlet 配置的参数,封装成 ServletConfigPropertyValues对象。
- 将当前Servlet 类型的实例转换成BeanWrapper类型的实例。以便使用Spring中提供的注入功能进行对应的属性注入。这些属性如contextAttribute、contextClass、nameSpace、contextConfigLocation 等,均可以在web.xml 文件中以初始化参数的方式配置在servlet 的声明中。
- 调用 initServletBean() 初始化servletBean。
onRefresh() 方法
在初始化servletBean的时候,最终会调用 onRefresh() 方法,该方法主要是刷新Spring在web功能实现中所必须使用的全局变量。post

- initMultipartResolver(context);
初始化文件上传的处理类
- initLocaleResolver(context);
初始化国际化配置的处理类
- initThemeResolver(context);
初始化主题资源的处理类
- initHandlerMappings(context);
初始化处理请求的类,主要负责处理请求调用Controller的处理类。
- initHandlerAdapters(context);
初始化HandlerAdapter的适配器
- initHandlerExceptionResolvers(context);
初始化异常处理类。
- initRequestToViewNameTranslator(context);
初始化视图转换器,用于直接将请求转换为逻辑视图名。
- initViewResolvers(context);
初始化视图解析器,定义了如何经过view 名称来解析对应View实例的行为
- initFlashMapManager(context);
初始化Flash Map,提供一个请求存储属性,可供其它请求使用。
DispatchServlet的请求处理逻辑
servlet 接受到请求后,会调用service() 方法,而后service根据HTTP响应的请求方法进行调用响应的逻辑处理。url

从类结构中,能够看出SpringMVC 支持 GET、POST、PUT、DELETE、OPTIONS、TRACE方法spa

从代码中,咱们发现这几个方法交给 processRequest() 来进行处理请求。3d
processRequest()->doService()->doDispatch()
经过跟踪代码,最终处理请求的核心代码在doDispatch()方法中。code
doDispatch() 方法

- 检查该请求是不是文件上传请求,若是是则把request转换为 MultipartHttpServletRequest类型。
- 根据request信息查找对应的Handler,若是没有找到对应的Handler,则经过response反馈错误信息。
- 经过当前的handler 查找对应的HandlerAdapter
- 判断该HTTP请求是否是HEAD或GET请求,若是是则检查HTTP请求头部的LastModified属性,来判断该页面是否须要从新加载。

- applyPreHandle() 执行该请求所匹配的拦截器,并调用全部匹配拦截器的preHandle()方法,进行处理
- 调用handle() 方法去根据请求路径去调用用户实现的Controller实现逻辑
- applyPostHandle()执行该请求全部匹配的拦截器,并调用全部匹配拦截器的postHandle()方法,进行处理
- processDispatchResult()处理页面跳转和调用拦截器的afterCompletion() 方法
processDispatchResult() 方法

- 处理异常信息
- 若是Controller成功返回了ModelAndView,则经过render()方法进行响应相应的页面信息
- 执行完毕后,执行该请求全部匹配的拦截器,并调用全部匹配拦截器的afterCompletion()方法,进行处理