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
方法。
最后执行完回到过滤器。