(一)springMVC源码分析--HandlerMethodReturnValueHandlerComposite返回值解析器集合(二)
(二)springMVC源码分析--ViewNameMethodReturnValueHandler返回值处理器(三)
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 class ServletInvocableHandlerMethod extends InvocableHandlerMethod {
....
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提供的返回值处理器。
selectHandler是选取返回值处理器
public class HandlerMethodReturnValueHandlerComposite implements AsyncHandlerMethodReturnValueHandler {
private final List returnValueHandlers = new ArrayList();
......
public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest) throws Exception {
//选择可以处理返回值的处理器
HandlerMethodReturnValueHandler handler = this.selectHandler(returnValue, returnType);
if(handler == null) {
throw new IllegalArgumentException("Unknown return value type: " + returnType.getParameterType().getName());
} else {
//处理返回值,具体实现是在HandlerMethodReturnValueHandler的实现类中
handler.handleReturnValue(returnValue, returnType, mavContainer, webRequest);
}
}
//选择获取可以处理返回值的处理器
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函数之后对返回值的处理操作过程。