• SpringMVC源码解读


    使用@RequestMapping注解时,配置的信息最后都设置到了RequestMappingInfo中.

    RequestMappingInfo封装了PatternsRequestCondition,RequestMethodsRequestCondition,ParamsRequestCondition等,所以自己不干活,所有的活都是委托给具体的condition处理.

    先看下封装的RequestCondition吧,之前的文章将的比较细了,不清楚各个类具体是做什么的,可以移步这里<SpringMVC源码解读 - RequestMapping注解实现解读 - RequestCondition体系>

     1 package org.springframework.web.servlet.mvc.method;
     2 public final class RequestMappingInfo implements RequestCondition<RequestMappingInfo> {
     3 
     4     private final PatternsRequestCondition patternsCondition;
     5 
     6     private final RequestMethodsRequestCondition methodsCondition;
     7 
     8     private final ParamsRequestCondition paramsCondition;
     9 
    10     private final HeadersRequestCondition headersCondition;
    11 
    12     private final ConsumesRequestCondition consumesCondition;
    13 
    14     private final ProducesRequestCondition producesCondition;
    15 
    16     private final RequestConditionHolder customConditionHolder;
    17 }

    初始化没什么好看的,直接看接口的实现吧.

    貌似combine也没啥料,就是分别委托

     1     /**
     2      * Combines "this" request mapping info (i.e. the current instance) with another request mapping info instance.
     3      * <p>Example: combine type- and method-level request mappings.
     4      * @return a new request mapping info instance; never {@code null}
     5      */
     6     public RequestMappingInfo combine(RequestMappingInfo other) {
     7         PatternsRequestCondition patterns = this.patternsCondition.combine(other.patternsCondition);
     8         RequestMethodsRequestCondition methods = this.methodsCondition.combine(other.methodsCondition);
     9         ParamsRequestCondition params = this.paramsCondition.combine(other.paramsCondition);
    10         HeadersRequestCondition headers = this.headersCondition.combine(other.headersCondition);
    11         ConsumesRequestCondition consumes = this.consumesCondition.combine(other.consumesCondition);
    12         ProducesRequestCondition produces = this.producesCondition.combine(other.producesCondition);
    13         RequestConditionHolder custom = this.customConditionHolder.combine(other.customConditionHolder);
    14 
    15         return new RequestMappingInfo(patterns, methods, params, headers, consumes, produces, custom.getCondition());
    16     }

    getMatchingCondition只是体现出可能基于性能消耗的考虑,把PatternsRequestCondition和RequestConditionHolder的比较放到后面单独处理了.

     1     /**
     2      * Checks if all conditions in this request mapping info match the provided request and returns
     3      * a potentially new request mapping info with conditions tailored to the current request.
     4      * <p>For example the returned instance may contain the subset of URL patterns that match to
     5      * the current request, sorted with best matching patterns on top.
     6      * @return a new instance in case all conditions match; or {@code null} otherwise
     7      */
     8     public RequestMappingInfo getMatchingCondition(HttpServletRequest request) {
     9         RequestMethodsRequestCondition methods = methodsCondition.getMatchingCondition(request);
    10         ParamsRequestCondition params = paramsCondition.getMatchingCondition(request);
    11         HeadersRequestCondition headers = headersCondition.getMatchingCondition(request);
    12         ConsumesRequestCondition consumes = consumesCondition.getMatchingCondition(request);
    13         ProducesRequestCondition produces = producesCondition.getMatchingCondition(request);
    14 
    15         if (methods == null || params == null || headers == null || consumes == null || produces == null) {
    16             return null;
    17         }
    18 
    19         PatternsRequestCondition patterns = patternsCondition.getMatchingCondition(request);
    20         if (patterns == null) {
    21             return null;
    22         }
    23 
    24         RequestConditionHolder custom = customConditionHolder.getMatchingCondition(request);
    25         if (custom == null) {
    26             return null;
    27         }
    28 
    29         return new RequestMappingInfo(patterns, methods, params, headers, consumes, produces, custom.getCondition());
    30     }

    compareTo就是排了个不同RequestCondition的优先级

     1     /**
     2      * Compares "this" info (i.e. the current instance) with another info in the context of a request.
     3      * <p>Note: it is assumed both instances have been obtained via
     4      * {@link #getMatchingCondition(HttpServletRequest)} to ensure they have conditions with
     5      * content relevant to current request.
     6      */
     7     public int compareTo(RequestMappingInfo other, HttpServletRequest request) {
     8         int result = patternsCondition.compareTo(other.getPatternsCondition(), request);
     9         if (result != 0) {
    10             return result;
    11         }
    12         result = paramsCondition.compareTo(other.getParamsCondition(), request);
    13         if (result != 0) {
    14             return result;
    15         }
    16         result = headersCondition.compareTo(other.getHeadersCondition(), request);
    17         if (result != 0) {
    18             return result;
    19         }
    20         result = consumesCondition.compareTo(other.getConsumesCondition(), request);
    21         if (result != 0) {
    22             return result;
    23         }
    24         result = producesCondition.compareTo(other.getProducesCondition(), request);
    25         if (result != 0) {
    26             return result;
    27         }
    28         result = methodsCondition.compareTo(other.getMethodsCondition(), request);
    29         if (result != 0) {
    30             return result;
    31         }
    32         result = customConditionHolder.compareTo(other.customConditionHolder, request);
    33         if (result != 0) {
    34             return result;
    35         }
    36         return 0;
    37     }

    覆写的equals,hashCode,toString不看也罢

  • 相关阅读:
    网络安全系列 之 MySQL数据库安全
    设计模式 之 责任链模式学习实践
    清晰化算法在DSP上的实现
    图像清晰化 之雾天图像清晰化处理
    Jupyter Notebook
    网络安全系列 之 协议安全
    FTP、FTPS、SFTP概览
    ImportError: Imageio Pillow plugin requires Pillow, not PIL!
    ubuntu 下开机启动项修复(进不去windows系统)
    error while loading shared libraries: libopencv_core.so.3.4: cannot open shared object file: No such file or directory
  • 原文地址:https://www.cnblogs.com/leftthen/p/5210837.html
Copyright © 2020-2023  润新知