美文网首页
Spring mvc之RequestMappingInfo类

Spring mvc之RequestMappingInfo类

作者: engineer_tang | 来源:发表于2021-04-01 06:32 被阅读0次
    image.png

    请求映射信息。封装以下请求映射条件:

    1. PatternsRequestCondition
    2. RequestMethodsRequestCondition
    3. ParamsRequestCondition
    4. HeadersRequestCondition
    5. ConsumesRequestCondition
    6. ProducesRequestCondition
    7. RequestCondition (optional, custom request condition)

    1. 参数说明

        @Nullable
        private final String name;
    
        private final PatternsRequestCondition patternsCondition;
    
        private final RequestMethodsRequestCondition methodsCondition;
    
        private final ParamsRequestCondition paramsCondition;
    
        private final HeadersRequestCondition headersCondition;
    
        private final ConsumesRequestCondition consumesCondition;
    
        private final ProducesRequestCondition producesCondition;
    
        private final RequestConditionHolder customConditionHolder;
    
        private final int hashCode;
    

    1.1 属性name

    这个映射对象的名字

    1.2 属性patternsCondition

    此RequestMappingInfo对象的URL模式


    image.png

    如图所示该对象的patterns属性是一个Set接口实现类,保存了当前请求访问路径。

    1.3 属性methodsCondition

    此RequestMappingInfo的HTTP请求方法;


    image.png

    该属性methods集合中存储了请求类型的枚举信息。

    1.4 属性paramsCondition

    此RequestMappingInfo的“参数”条件

    1.5 属性headersCondition

    此RequestMappingInfo的“headers”条件;

    1.6 属性consumesCondition

    1.7 属性customConditionHolder

    2. 方法说明

    构造方法有3个,如下所示:

    public RequestMappingInfo(@Nullable String name, @Nullable PatternsRequestCondition patterns,
                @Nullable RequestMethodsRequestCondition methods, @Nullable ParamsRequestCondition params,
                @Nullable HeadersRequestCondition headers, @Nullable ConsumesRequestCondition consumes,
                @Nullable ProducesRequestCondition produces, @Nullable RequestCondition<?> custom) ;
    
    public RequestMappingInfo(@Nullable PatternsRequestCondition patterns,
                @Nullable RequestMethodsRequestCondition methods, @Nullable ParamsRequestCondition params,
                @Nullable HeadersRequestCondition headers, @Nullable ConsumesRequestCondition consumes,
                @Nullable ProducesRequestCondition produces, @Nullable RequestCondition<?> custom);
    
    public RequestMappingInfo(RequestMappingInfo info, @Nullable RequestCondition<?> customRequestCondition);
    

    完整的构造方法业务代码如下:

        public RequestMappingInfo(@Nullable String name, @Nullable PatternsRequestCondition patterns,
                @Nullable RequestMethodsRequestCondition methods, @Nullable ParamsRequestCondition params,
                @Nullable HeadersRequestCondition headers, @Nullable ConsumesRequestCondition consumes,
                @Nullable ProducesRequestCondition produces, @Nullable RequestCondition<?> custom) {
    
            this.name = (StringUtils.hasText(name) ? name : null);
            this.patternsCondition = (patterns != null ? patterns : EMPTY_PATTERNS);
            this.methodsCondition = (methods != null ? methods : EMPTY_REQUEST_METHODS);
            this.paramsCondition = (params != null ? params : EMPTY_PARAMS);
            this.headersCondition = (headers != null ? headers : EMPTY_HEADERS);
            this.consumesCondition = (consumes != null ? consumes : EMPTY_CONSUMES);
            this.producesCondition = (produces != null ? produces : EMPTY_PRODUCES);
            this.customConditionHolder = (custom != null ? new RequestConditionHolder(custom) : EMPTY_CUSTOM);
    
            this.hashCode = calculateHashCode(
                    this.patternsCondition, this.methodsCondition, this.paramsCondition, this.headersCondition,
                    this.consumesCondition, this.producesCondition, this.customConditionHolder);
        }
    

    3. 匹配

    3.1 匹配调用栈

    AbstractHandlerMethodMapping方法

        private void addMatchingMappings(Collection<T> mappings, List<Match> matches, HttpServletRequest request) {
            for (T mapping : mappings) {
                T match = getMatchingMapping(mapping, request);
                if (match != null) {
                    matches.add(new Match(match, this.mappingRegistry.getMappings().get(mapping)));
                }
            }
        }
    

    RequestMappingInfoHandlerMapping类方法

        @Override
        protected RequestMappingInfo getMatchingMapping(RequestMappingInfo info, HttpServletRequest request) {
            return info.getMatchingCondition(request);
        }
    

    3.2 匹配业务具体实现

    检查此请求映射信息中的所有条件是否与提供的请求匹配,并返回一个可能的新请求映射信息,其中包含为当前请求定制的条件。
    例如,返回的实例可能包含与当前请求匹配的URL模式的子集,并在顶部按最佳匹配模式排序。
    返回:如果匹配,则为新实例;否则为空。

        @Override
        @Nullable
        public RequestMappingInfo getMatchingCondition(HttpServletRequest request) {
            RequestMethodsRequestCondition methods = this.methodsCondition.getMatchingCondition(request);
            if (methods == null) {
                return null;
            }
            ParamsRequestCondition params = this.paramsCondition.getMatchingCondition(request);
            if (params == null) {
                return null;
            }
            HeadersRequestCondition headers = this.headersCondition.getMatchingCondition(request);
            if (headers == null) {
                return null;
            }
            ConsumesRequestCondition consumes = this.consumesCondition.getMatchingCondition(request);
            if (consumes == null) {
                return null;
            }
            ProducesRequestCondition produces = this.producesCondition.getMatchingCondition(request);
            if (produces == null) {
                return null;
            }
            PathPatternsRequestCondition pathPatterns = null;
            if (this.pathPatternsCondition != null) {
                pathPatterns = this.pathPatternsCondition.getMatchingCondition(request);
                if (pathPatterns == null) {
                    return null;
                }
            }
            PatternsRequestCondition patterns = null;
            if (this.patternsCondition != null) {
                patterns = this.patternsCondition.getMatchingCondition(request);
                if (patterns == null) {
                    return null;
                }
            }
            RequestConditionHolder custom = this.customConditionHolder.getMatchingCondition(request);
            if (custom == null) {
                return null;
            }
            return new RequestMappingInfo(
                    this.name, pathPatterns, patterns, methods, params, headers, consumes, produces, custom);
        }
    

    4. Match类

    AbstractHandlerMethodMapping类中的私有内部类,围绕匹配的HandlerMethod及其映射的瘦包装,用于在当前请求的上下文中将最佳匹配与比较器进行比较。

        private class Match {
    
            private final T mapping;
    
            private final HandlerMethod handlerMethod;
    
            public Match(T mapping, HandlerMethod handlerMethod) {
                this.mapping = mapping;
                this.handlerMethod = handlerMethod;
            }
    
            @Override
            public String toString() {
                return this.mapping.toString();
            }
        }
    

    相关文章

      网友评论

          本文标题:Spring mvc之RequestMappingInfo类

          本文链接:https://www.haomeiwen.com/subject/izmnhltx.html