转自:
下文笔者将讲述RequestMappingHandlerMapping类的简介说明,如下所示:
RequestMappingHandlerMapping的功能:
RequestMappingHandlerMapping是AbstractHandlerMethodMapping唯一的实现类
它根据@RequestMapping注解生成 RequestMappingInfo,同时提供isHandler实现。
afterPropertiesSet() 重写父类初始化方法
@Override
public void afterPropertiesSet() {
//config为RequestMappingInfo的创建对象
this.config = new RequestMappingInfo.BuilderConfiguration();
//设置urlPathHelper默认为UrlPathHelper.class
this.config.setUrlPathHelper(getUrlPathHelper());
//默认为AntPathMatcher,路径匹配校验器
this.config.setPathMatcher(getPathMatcher());
//是否支持后缀补充,默认为true
this.config.setSuffixPatternMatch(this.useSuffixPatternMatch);
//是否添加"/"后缀,默认为true
this.config.setTrailingSlashMatch(this.useTrailingSlashMatch);
//是否采用mediaType匹配模式,比如.json/.xml模式的匹配,默认为false
this.config.setRegisteredSuffixPatternMatch(this.useRegisteredSuffixPatternMatch);
//mediaType处理类
this.config.setContentNegotiationManager(getContentNegotiationManager());
//调用父类进行HandlerMethod的注册工作
super.afterPropertiesSet();
}
isHandler() 判断获取何种类型的Handler
@Override
protected boolean isHandler(Class beanType) {
//优先匹配@Controller
return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}
获取@Controller/@RequestMapping注解下的handler
getMappingForMethod() 获取HandlerMethod对应的mapping属性
@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class handlerType) {
//对method以及class类都进行创建RequestMappingInfo
//因为@RequestMapping可以在方法上/类上应用注解
RequestMappingInfo info = null;
// 读取方法上的RequestMapping注解信息
RequestMapping methodAnnotation = AnnotationUtils.findAnnotation(method, RequestMapping.class);
if (methodAnnotation != null) {
// 读取自定义的条件,这边没有使用
RequestCondition methodCondition = getCustomMethodCondition(method);
// 根据方法上的RequsetMapping注解和自定义条件,生成匹配条件.这边的匹配条件包括http method,request parameter,request header等
info = createRequestMappingInfo(methodAnnotation, methodCondition);
// 读取类上的RequestMapping注解信息
RequestMapping typeAnnotation = AnnotationUtils.findAnnotation(handlerType, RequestMapping.class);
if (typeAnnotation != null) {
RequestCondition typeCondition = getCustomTypeCondition(handlerType);
// 生成类上的匹配条件,并合并方法上的
info = createRequestMappingInfo(typeAnnotation, typeCondition).combine(info);
}
}
return info;
}
protected RequestMappingInfo createRequestMappingInfo(RequestMapping requestMapping, RequestCondition customCondition) {
return RequestMappingInfo
.paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
.methods(requestMapping.method())
.params(requestMapping.params())
.headers(requestMapping.headers())
.consumes(requestMapping.consumes())
.produces(requestMapping.produces())
.mappingName(requestMapping.name())
.customCondition(customCondition)
.options(this.config)
.build();
}
Original: https://blog.csdn.net/qq_25073223/article/details/127815788
Author: qq_25073223
Title: RequestMappingHandlerMapping类的简介说明
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/655162/
转载文章受原作者版权保护。转载请注明原作者出处!