HandlerMethodReturnValueHandler是用于对Controller中函数执行的返回值进行处理操作的,springMVC提供了多个HandlerMethodReturnValueHandler的实现类。
接口HandlerMethodReturnValueHandler定义的抽象方法还是比较简单的,源码如下:
(1)supportsReturnType用于判断是否支持对返回值的处理。
(2)handleReturnValue实现对返回值的处理操作。
public interface HandlerMethodReturnValueHandler { //判断是否支持 boolean supportsReturnType(MethodParameter returnType); //处理返回值操作 void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception; }
springMVC中对返回值的操作流程如下:执行过程是在ServletInvocableHandlerMethod的invokeAndHandle中
public void invokeAndHandle(ServletWebRequest webRequest, ModelAndViewContainer mavContainer, Object... providedArgs) throws Exception { //处理操作的返回值 Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs); ....... //对返回值进行处理操作 this.returnValueHandlers.handleReturnValue( returnValue, getReturnValueType(returnValue), mavContainer, webRequest); ......... }
具体实现是在HandlerMethodReturnValueHandlerComposite中,HandlerMethodReturnValueHandlerComposite中包含了所有springMVC提供的返回值处理器。
@Override public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception { //选择可以处理返回值的处理器 HandlerMethodReturnValueHandler handler = selectHandler(returnValue, returnType); Assert.notNull(handler, "Unknown return value type [" + returnType.getParameterType().getName() + "]"); //处理返回值,具体实现是在HandlerMethodReturnValueHandler的实现类中 handler.handleReturnValue(returnValue, returnType, mavContainer, webRequest); }
selectHandler是选取返回值处理器
//选择获取可以处理返回值的处理器 private HandlerMethodReturnValueHandler selectHandler(Object value, MethodParameter returnType) { boolean isAsyncValue = isAsyncReturnValue(value, returnType); for (HandlerMethodReturnValueHandler handler : this.returnValueHandlers) { if (isAsyncValue && !(handler instanceof AsyncHandlerMethodReturnValueHandler)) { continue; } if (handler.supportsReturnType(returnType)) { return handler; } } return null; }
以上代码就完成了执行Controller函数之后对返回值的处理操作过程。