springMVC源码分析--HandlerMethodReturnValueHandler返回值解析器(一)

(一)springMVC源码分析--HandlerMethodReturnValueHandlerComposite返回值解析器集合(二)
(二)springMVC源码分析--ViewNameMethodReturnValueHandler返回值处理器(三)
HandlerMethodReturnValueHandler是用于对Controller中函数执行的返回值进行处理操作的,springMVC提供了多个HandlerMethodReturnValueHandler的实现类。

HandlerMethodReturnValueHandler接口以及它的实现类.png

接口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<HandlerMethodReturnValueHandler> 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函数之后对返回值的处理操作过程。

转载于:http://blog.csdn.net/qq924862077/article/details/54177447
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,890评论 18 139
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,360评论 11 349
  • 文:红四过小 某天在宿舍,室友正在看一个记者采访路人:如果你的男朋友没房没车,你愿意跟他结婚吗?里面的答案有三分之...
    红四过小阅读 154评论 0 2
  • 如果说有一种鞋,流行了很多年,依旧处在流行的最前端的话,那么这双鞋一定就是那传说中的百搭神器——小白鞋了! 在属于...
    美姬酱阅读 1,672评论 0 1
  • 赵舞曼妙为君开, 秋水伊人今尚在。 阳城一笑如当年, 愿景繁华自难却。 幸运开怀暖阳照, 福泰安康雨露新。 快意人...
    十月听风阅读 201评论 0 4