我们可以把处理请求的过程分成三部分来讲:

  1. 处理主流程;
  2. 参数绑定;
  3. 处理返回值

一.处理主流程

通过Handler处理业务请求时,并不是直接调用Handler,而是通过HandlerAdapter来调用。这样做的好处是Handler的实现方式不受限制,只要提供匹配HandlerAdapter就可以,而且同一个HandlerAdapter原则可以匹配多种类型的Handler。

下图是Handler处理主流程时序图:

查看大图

Handler处理主流程时序图

二.参数绑定

参数绑定我们就看两个我们常用的,其他情况相对比较简单:

  1. Form表单参数绑定
  2. Json数据参数绑定

1.Form表单参数绑定

下图是Form表单参数绑定时序图:

查看大图

Form表单参数绑定时序图

2.Json数据参数绑定

下图是Json数据参数绑定时序图:

查看大图

Json数据参数绑定时序图

我们发现参数解析具体委托给HandlerMethodArgumentResolver实现类来解析。这里列举下常用的HandlerMethodArgumentResolver:

  1. ServletModelAttributeMethodProcessor:Form表单
  2. RequestResponseBodyMethodProcessor:Json数据
  3. RequestParamMethodArgumentResolver:简单属性,或文件上传
  4. ServletRequestMethodArgumentResolver:HttpServletRequest参数
  5. ServletResponseMethodArgumentResolver:HttpServletResponse参数

在确定使用哪个HandlerMethodArgumentResolver时,Spring通过下图中的设计提高程序的扩展性。之前同事在做认证的时候也采用了这种方式,效果十分的好。

下图是HandlerMethodArgumentResolverComposite部分源代码:

查看大图

HandlerMethodArgumentResolverComposite部分源代码

下图是RequestResponseBodyMethodProcessor的部分源代码。请求时通过@RequestBody判断是否需要处理,响应时通过@ResponseBody进行判断。

下图是RequestResponseBodyMethodProcessor部分源代码:

查看大图

RequestResponseBodyMethodProcessor部分源码

三.处理返回值

我们以常用返回Json数据为例,看看Spring是如何处理的。

下图是处理返回值时序图:

查看大图

处理返回值时序图

和处理参数绑定一样,处理返回值时具体委托给HandlerMethodReturnValueHandler实现类来处理。这里列举下常用的HandlerMethodReturnValueHandler:

  1. RequestResponseBodyMethodProcessor:输出响应数据,如Json数据
  2. ViewNameMethodReturnValueHandler:设置视图名

上面就是请求处理的主要逻辑。如果返回Json数据是不需要视图渲染,主要逻辑基本已完成。如果是需要视图解析,那我们看下视图处理的处理过程。

快速导航: