SpringMVC源码解读 - RequestMapping注解实现解读 - RequestMappingInfo

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC源码解读 - RequestMapping注解实现解读 - RequestMappingInfo相关的知识,希望对你有一定的参考价值。

使用@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不看也罢

 

以上是关于SpringMVC源码解读 - RequestMapping注解实现解读 - RequestMappingInfo的主要内容,如果未能解决你的问题,请参考以下文章

SpringMVC源码解读 - HandlerMapping

SpringMVC源码解读 - RequestMapping注解实现解读 - RequestMappingInfo

SpringMVC源码解读 - RequestMapping注解实现解读 - RequestCondition体系

SpringMVC源码解读--HandlerMapping代码解读

SpringMVC源码解读--HandlerMapping代码解读

SpringMVC源码解读--DispatcherServlet类