Spring MVC 一次请求完整过程

一次请求的完整顺序:

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

avatar

avatar

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

avatar

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

avatar

avatar

doService中调用doDispatch方法。

avatar

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

avatar

根据当前的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

avatar

avatar

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

avatar

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

avatar

调用AbstractHandlerMethodAdapterhandle方法。

avatar

调用RequestMappingHandlerAdapterhandleInternal方法。

avatar

avatar

调用RequestMappingHandlerAdapterinvokeHandlerMethod方法。

avatar

调用ServletInvocableHandlerMethodinvokeAndHandle方法。

avatar

avatar

调用InvocableHandlerMethodinvokeForRequest方法。

avatar

调用InvocableHandlerMethoddoInvoke方法。

avatar

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

avatar

avatar

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

avatar

avatar

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

avatar

最后执行完回到过滤器。