HandlerMethodReturnValueHandler是RequestMappingHandlerAdapter用来处理当含有@RequestMapping的方法调度完成后,后面要进行的事情。
首先是HandlerMethodReturnValueHandler的自定义注册:
|
|
在启动AnnotationDrivenBeanDefinitionParser来解析mvc:annotation-driven标签的过程中,会注册我们所配置的HandlerMethodReturnValueHandler,如下:
|
|
|
|
然后将会这些自定义的HandlerMethodReturnValueHandler设置到RequestMappingHandlerAdapter的customReturnValueHandlers属性中
RequestMappingHandlerAdapter的两个重要属性:
customReturnValueHandlers:存放我们自定义的HandlerMethodReturnValueHandlerreturnValueHandlers:存放最终所有的HandlerMethodReturnValueHandler
|
|
returnValueHandlers的属性类型为HandlerMethodReturnValueHandlerComposite,里面也有一个list集合,来存放所有的HandlerMethodReturnValueHandler。
默认的returnValueHandlers:
|
|
使用@ResponseBody注解的话最终返回值会被RequestResponseBodyMethodProcessor这个HandlerMethodReturnValueHandler实现类处理。
至此,所有的HandlerMethodReturnValueHandler的注册已经完成。
执行流程
- 第一步:获取合适的HandlerAdapter,当方法含有@RequestMapping注释的时候,便选择RequestMappingHandlerAdapter来进行方法的调度处理
- 第二步:方法的调度处理过程为:首先执行方法体,然后根据返回值来选择一个合适的HandlerMethodReturnValueHandler,如下代码:
|
|
|
|
this.returnValueHandlers.handleReturnValue(returnValue, getReturnValueType(returnValue), mavContainer, webRequest)会遍历所有的已注册的HandlerMethodReturnValueHandler判断他们支不支持returnValue的返回类型。如下:
|
|
找到支持的HandlerMethodReturnValueHandler后,就要执行它的handleReturnValue方法。假设使用了`@ResponseBody注解,则由RequestResponseBodyMethodProcessor类处理。
|
|
注意这里设置mavContainer.setRequestHandled(true),表示请求已被处理,不需要返回ModelAndView。看代码:
|
|