HandlerMethodReturnValueHandler
是RequestMappingHandlerAdapter
用来处理当含有@RequestMapping
的方法调度完成后,后面要进行的事情。
首先是HandlerMethodReturnValueHandler
的自定义注册:
|
|
在启动AnnotationDrivenBeanDefinitionParser
来解析mvc:annotation-driven
标签的过程中,会注册我们所配置的HandlerMethodReturnValueHandler
,如下:
|
|
|
|
然后将会这些自定义的HandlerMethodReturnValueHandler
设置到RequestMappingHandlerAdapter
的customReturnValueHandlers
属性中
RequestMappingHandlerAdapter
的两个重要属性:
customReturnValueHandlers
:存放我们自定义的HandlerMethodReturnValueHandler
returnValueHandlers
:存放最终所有的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
。看代码:
|
|