springmvc handler mapping
springmvc 内部初始化的HandlerMapping
-
"faviconHandlerMapping" -> {SimpleUrlHandlerMapping}
-
"requestMappingHandlerMapping" -> {RequestMappingHandlerMapping}
-
"beanNameHandlerMapping" -> {BeanNameUrlHandlerMapping}
-
"resourceHandlerMapping" -> {SimpleUrlHandlerMapping}
-
"welcomePageHandlerMapping" -> {WelcomePageHandlerMapping}
springmvc 内部如何判断一个路径映射是否重复
MappingRegistry 是中有一个字段为mappingLookup 。这是一个Map集合,其中key是RequestMappingInfo而value正是映射的HandlerMethod。 RequestMappingInfo 中包含了能够区分一个路径映射是否重复的信息。
RequestMappingInfo 代码详单如下(省略方法部分)
public final class RequestMappingInfo implements RequestCondition<RequestMappingInfo> { @Nullable private final String name;//@RequestMapping 配置的name 但是一直为空 实验的时候 private final PatternsRequestCondition patternsCondition;//路径映射 /a/b private final RequestMethodsRequestCondition methodsCondition;// 方法映射 GET POST private final ParamsRequestCondition paramsCondition;//提交参数 ?a=2 private final HeadersRequestCondition headersCondition;// application/x-www-form-urlencoded private final ConsumesRequestCondition consumesCondition;//请求的头信息 private final ProducesRequestCondition producesCondition;//相应头信息 private final RequestConditionHolder customConditionHolder;//自定义条件 }
assertUniqueMethodMapping 是作为防重复的校验方法的存在,代码详单如下:
private void assertUniqueMethodMapping(HandlerMethod newHandlerMethod, T mapping) { HandlerMethod handlerMethod = this.mappingLookup.get(mapping); if (handlerMethod != null && !handlerMethod.equals(newHandlerMethod)) { throw new IllegalStateException( "Ambiguous mapping. Cannot map '" + newHandlerMethod.getBean() + "' method \n" + newHandlerMethod + "\nto " + mapping + ": There is already '" + handlerMethod.getBean() + "' bean method\n" + handlerMethod + " mapped."); } }
从上面的代码可以看出,首先通过map集合获取该方法,接着比较是否给定的handlerMethod是否于新入选的newHandlerMethod一致,如果一致则抛出异常。这里的mapping对应的就是RequestMappingInfo。