springMVC源码分析--HandlerMethodReturnValueHandlerComposite返回值解析器集合(二)

来源:互联网 发布:dnf制卡辅助与端口辅助 编辑:程序博客网 时间:2024/06/10 14:29

在上一篇博客 springMVC源码分析--HandlerMethodReturnValueHandler返回值解析器(一)我们介绍了返回值解析器HandlerMethodReturnValueHandler,接触到了HandlerMethodReturnValueHandlerComposite,简单来说HandlerMethodReturnValueHandlerComposite其实就是springMVC提供的所有的HandlerMethodReturnValueHandler集合,它定义了一个链表用于存储所有实现的HandlerMethodReturnValueHandler。

(1)private final List<HandlerMethodReturnValueHandler> returnValueHandlers 用于存储所有的HandlerMethodReturnValueHandler。

(2)supportsReturnType函数用于判断HandlerMethodReturnValueHandler是否支持处理函数返回值。

(3)handleReturnValue用于根据获取的HandlerMethodReturnValueHandler来处理函数返回值。

(4)HandlerMethodReturnValueHandlerComposite提供了get和setHandlerMethodReturnValueHandler方法

public class HandlerMethodReturnValueHandlerComposite implements AsyncHandlerMethodReturnValueHandler {protected final Log logger = LogFactory.getLog(getClass());//存储springMVC提供的所有的函数返回值处理器private final List<HandlerMethodReturnValueHandler> returnValueHandlers =new ArrayList<HandlerMethodReturnValueHandler>();public List<HandlerMethodReturnValueHandler> getHandlers() {return Collections.unmodifiableList(this.returnValueHandlers);}//判断返回值是否有HandlerMethodReturnValueHandler的实现类去处理@Overridepublic boolean supportsReturnType(MethodParameter returnType) {return getReturnValueHandler(returnType) != null;}//根据返回类型选取返回值处理器private HandlerMethodReturnValueHandler getReturnValueHandler(MethodParameter returnType) {for (HandlerMethodReturnValueHandler handler : this.returnValueHandlers) {if (handler.supportsReturnType(returnType)) {return handler;}}return null;}//处理返回值@Overridepublic 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() + "]");handler.handleReturnValue(returnValue, returnType, mavContainer, webRequest);}//查找是否处理返回值的HandlerMethodReturnValueprivate 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;}@Overridepublic boolean isAsyncReturnValue(Object value, MethodParameter returnType) {for (HandlerMethodReturnValueHandler handler : this.returnValueHandlers) {if (handler instanceof AsyncHandlerMethodReturnValueHandler) {if (((AsyncHandlerMethodReturnValueHandler) handler).isAsyncReturnValue(value, returnType)) {return true;}}}return false;}//添加返回值处理器public HandlerMethodReturnValueHandlerComposite addHandler(HandlerMethodReturnValueHandler handler) {this.returnValueHandlers.add(handler);return this;}//添加返回值处理器public HandlerMethodReturnValueHandlerComposite addHandlers(List<? extends HandlerMethodReturnValueHandler> handlers) {if (handlers != null) {for (HandlerMethodReturnValueHandler handler : handlers) {this.returnValueHandlers.add(handler);}}return this;}}


1 0