Spring MVC 一次请求完整过程
一次请求的完整顺序:
| 调用顺序 | 说明 |
|---|---|
| Filter -> | 用户自定义过滤器 |
| DispatcherServlet -> | 调度中心 |
| HandlerMapping -> | 处理请求映射 |
| getHandler -> | 得到请求对应的处理方法 |
| getHandlerAdapter -> | 得到调用处理方法的适配器 |
| Interceptor.preHandle -> | 拦截器前处理 |
| handlerAdapter.handle -> | 调用适配器方法 |
| HandlerMethod.invoke -> | 调用请求对应的用户定义方法 |
| Interceptor.postHandle -> | 拦截器后处理 |
| Interceptor.afterCompletion -> | 拦截器完成处理 |
| Filter | 回到用户自定义过滤器 |


用户请求首先进入过滤器中,根据过滤链
FilterChain定义进行顺序执行。

请求通过过滤链之后就会进入
DispatcherServlet调度中心的doService方法,这也是常规Servlet的调度流程。


在
doService中调用doDispatch方法。

在
getHandler方法中获取到URL到处理方法的映射关系,并根据请求获取对应的处理方法。这里获取到的并不仅仅是用户定义的Controller处理方法,还包括拦截器,因此返回得到的是HandlerExecutionChain执行链。

根据当前的
Handler获取对应的执行适配器。这里需要说明的是由于Web请求可能会有很多种类型,比如数据请求和静态资源请求,也会有很多种实现方式,比如使用注解的
@Controller、实现Controller接口和实现Servlet接口,所以Spring MVC为了应对不同类型的请求,定义了Adapter这一角色,主要是为了根据请求的不同类型使用不同的方法处理请求。这里getHandlerAdapter就是为了获取到请求对应的处理适配器。Spring MVC中适配器的类型主要分为以下几种:AnnotationMethodHandlerAdapter: 适配注解类处理器,即使用@Controller的处理器HttpRequestHandlerAdapter: 适配静态资源处理器,静态资源处理器是实现HttpRequestHandler接口的处理器,这类处理器的作用是处理通过Spring MVC访问静态资源的请求。SimpleControllerHandlerAdapter: 适配实现了Controller接口或Controller接口子类的处理器,比如MultiActionController。SimpleServletHandlerAdapter: 适配实现了Servlet接口或Servlet的子类的处理器。
需要注意的是适配器是可以通过配置文件进行配置的,如果没有配置DispatcherServlet会读取DispatcherServlet.properties进行默认配置,默认的适配器只有前三种,没有SimpleServletHandlerAdapter。


获取到适配器后,开始执行调用链中的拦截器
preHandle方法。

执行完拦截器后才会使用适配器执行用户自定义的请求处理方法。

调用
AbstractHandlerMethodAdapter的handle方法。

调用
RequestMappingHandlerAdapter的handleInternal方法。


调用
RequestMappingHandlerAdapter的invokeHandlerMethod方法。

调用
ServletInvocableHandlerMethod的invokeAndHandle方法。


调用
InvocableHandlerMethod的invokeForRequest方法。

调用
InvocableHandlerMethod的doInvoke方法。

(最重要的来了)进入到用户定义的请求处理方法。


得到请求结果后,执行拦截器的
postHandle方法。


最后执行拦截器的
afterCompletion方法。

最后执行完回到过滤器。