• ServletInvocableHandlerMethod类简介说明


    转自:

    ServletInvocableHandlerMethod类简介说明

    下文讲述ServletInvocableHandlerMethod类的简介说明,如下所示:

    ServletInvocableHandlerMethod类简介

    HandlerAdapter在内部对于每个请求
    都会实例化一个ServletInvocableHandlerMethod进行处理
    ServletInvocableHandlerMethod在进行处理的时候
    会分两部分别对请求跟响应进行处理
    

    ServletInvocableHandlerMethod类继承关系

      Object 
         HandlerMethod
    	    InvocableHandlerMethod
    		   ServletInvocableHandlerMethod
    		     ConcurrentResultHandlerMethod 
    

    ServletInvocableHandlerMethod类构造函数

    public ServletInvocableHandlerMethod(HandlerMethod handlerMethod) {
        //调用父类的构造函数
        super(handlerMethod);
    	//获取@ResponseStatus的注解赋值给成员变量
        initResponseStatus();
    }
    

    invokeAndHandle() 调用HandlerMethod中控制器的指定方法

    public void invokeAndHandle(ServletWebRequest webRequest,ModelAndViewContainer mavContainer, 
    Object... providedArgs) throws Exception {
        // 关键 -> 1.执行控制器指定方法
        Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs);
    
        // 2.设置响应状态
        setResponseStatus(webRequest);
    
        // 3.判断请求是否处理完毕,根据返回值来判断。
        if (returnValue == null) {
            if (isRequestNotModified(webRequest) || 
                hasResponseStatus() || 
                mavContainer.isRequestHandled()) {
    
                // 为 true ,表示方法调用完毕
                mavContainer.setRequestHandled(true);
                return;
            }
        }else if (StringUtils.hasText(this.responseReason)) {
            mavContainer.setRequestHandled(true);
            return;
        }
    
        // 存在返回值时,可能还需进行视图解析
        mavContainer.setRequestHandled(false);
    
        try {
            // 处理返回值,在 MavContainer 中设置 ViewName
            // 并判断其是不是【重定向请求】
            this.returnValueHandlers.handleReturnValue(
                returnValue, 
                getReturnValueType(returnValue), 
                mavContainer, 
                webRequest);
    
        }catch (Exception ex) {
            // 抛出异常...
        }
    }
    //执行控制器指定方法
    public Object invokeForRequest(NativeWebRequest request, ModelAndViewContainer mavContainer,
        Object... providedArgs) throws Exception {
        // 取得方法入参值
        Object[] args = getMethodArgumentValues(request, mavContainer, providedArgs);
    
        // 利用反射执行该方法,并取得返回值
        Object returnValue = doInvoke(args);
        return returnValue;
    }
    protected Object doInvoke(Object... args) throws Exception {
    
        // 设置方法的访问权限,BridgedMethod 表示控制器类的指定方法
        ReflectionUtils.makeAccessible(getBridgedMethod());
        try {
            // 关键 -> 利用反射执行该方法,Bean 表示控制器类名称
            return getBridgedMethod().invoke(getBean(), args);
    
        }catch (IllegalArgumentException ex) {
            // 抛出异常...
        }catch (InvocationTargetException ex) {
            // 抛出异常...
        }
    }
    
    ServletInvocableHandlerMethod对请求以及响应的处理
    1. 处理请求的时候,会根据ServletInvocableHandlerMethod的属性argumentResolvers(这个属性是它的父类InvocableHandlerMethod中定义的)进行处理,其中argumentResolvers属性是一个HandlerMethodArgumentResolverComposite类 (这里使用了组合模式的一种变形) ,这个类是实现了HandlerMethodArgumentResolver接口的类,里面有各种实现了HandlerMethodArgumentResolver的List集合。
    
    2. 处理响应的时候,会根据ServletInvocableHandlerMethod的属性returnValueHandlers(自身属性)进行处理,returnValueHandlers属性是一个HandlerMethodReturnValueHandlerComposite类 (这里使用了组合模式的一种变形),这个类是实现了HandlerMethodReturnValueHandler接口的类,里面有各种实现了HandlerMethodReturnValueHandler的List集合。
     
    ServletInvocableHandlerMethod的returnValueHandlers和argumentResolvers这两个属性都是在ServletInvocableHandlerMethod进行实例化的时候被赋值的(使用RequestMappingHandlerAdapter的属性进行赋值);RequestMappingHandlerAdapter的argumentResolvers和returnValueHandlers这两个属性是在RequestMappingHandlerAdapter进行实例化的时候被Spring容器注入的
    
  • 相关阅读:
    使用uniapp开发时自定义tabbar
    【计算机网络】第五章 传输层
    外卖跑腿小程序开发如何满足不断变化的用户需求?
    Django Web架构:全面掌握Django模型字段(下)
    数据库三大范式、ER图与实体类、外键约束与级联操作你了解多少?
    哪些因素取决于产品设计中的质量?
    容联云入选IDC生成式AI图谱,多个案例被评典型应用
    CNCC 2023 | 大模型全面革新推荐系统!产学界多位大咖精彩献言
    干货来袭!JVM&G1 GC+JVM高级特性和最佳实践,助你深度掌握JVM
    如何将本地项目推送到gitee仓库
  • 原文地址:https://blog.csdn.net/qq_25073223/article/details/127799569