通过委托给已注册HandlerMethodReturnValueHandlers的列表来处理方法返回值。以前解析的返回类型被缓存以加快查找速度。
类图如下:
image.png
该类实现了HandlerMethodReturnValueHandler接口,维护了一个List集合HandlerMethodReturnValueHandler类型的returnValueHandlers 容器,如下:
private final List<HandlerMethodReturnValueHandler> returnValueHandlers = new ArrayList<>();
1.2 handleReturnValue方法
迭代注册的HandlerMethodReturnValueHandlers并调用支持它的Handlers。
2. HandlerMethodReturnValueHandler接口
3. AsyncHandlerMethodReturnValueHandler接口
类图如下:
image.png
支持异步类型的返回值处理程序。这样的返回值类型需要优先处理,以便异步值可以“展开”。
注意:不需要实现这个契约,但是当处理程序需要优先于其他处理程序时,应该实现这个契约。例如,自定义(异步)处理程序,默认情况下在内置处理程序之后排序,应该优先于 @ResponseBody o或@ModelAttribute 处理程序,这应该在异步值就绪后发生。相比之下,内置(异步)处理程序的顺序早于同步处理程序。
接口定义如下:
public interface AsyncHandlerMethodReturnValueHandler extends HandlerMethodReturnValueHandler {
boolean isAsyncReturnValue(@Nullable Object returnValue, MethodParameter returnType);
}
继承自HandlerMethodReturnValueHandler 接口,新增加了isAsyncReturnValue方法。它用于对给定的返回值是否表示异步计算。
private boolean isAsyncReturnValue(@Nullable Object value, MethodParameter returnType) {
for (HandlerMethodReturnValueHandler handler : this.returnValueHandlers) {
if (handler instanceof AsyncHandlerMethodReturnValueHandler &&
((AsyncHandlerMethodReturnValueHandler) handler).isAsyncReturnValue(value, returnType)) {
return true;
}
}
return false;
}