AbstractHandlerMapping
初始化HandlerInterceptor
AbstractHandlerMapping extends WebApplicationObjectSupport
WebApplicationObjectSupport extends ApplicationObjectSupport
ApplicationObjectSupport implements ApplicationContextAware
所以,AbstractHandlerMapping 初始化时会调用initApplicationContext()。
初始化Interceptors放入HandlerMapping中。
AbstractHandlerMethodMapping
初始化HandlerMethodMapping信息
implements InitializingBean
所以会初始化时候执行 initHandlerMethods()
- 首先要满足@Controller || @RequestMapping
- 解析出
,放入MappingRegistry。
MappingRegistry
- urlLookup:Url -> RequestMappingInfos
- mappingLookup:RequestMappingInfo -> HandlerMethod
这里的T 对于RequestMappingHandlerMapping来说就是RequestMappingInfo
RequestMappingInfo顾名思义Mapping信息。
HandlerMapping通过Url找到RequestMappingInfo,再通过RequestMappingInfo找到HandlerMethod。
RequestMappingHandlerMapping
RequestMappingInfo【Condition集合】
RequestMappingInfo是Condition集合,其中有关于@RequestMapping的各种Condition,还有一个CustomCondition,判断的时候也会判断该Condition是否成立。
自定义RequestMappingHandlerMapping
第一步:重写getCustomMethodCondition()
第二步:自定义AbstractRequestCondition
/**
* 匹配api请求条件的 RequestCondition
* @author HP
*
*/
public class ApiRequestCondition extends AbstractRequestCondition<ApiRequestCondition> {
private final Set<String> cmds;
public ApiRequestCondition(String... cmds) {
this(Arrays.asList(cmds));
}
private ApiRequestCondition(Collection<String> cmds) {
this.cmds = Collections.unmodifiableSet(new HashSet<String>(cmds));
}
/**
* @ApiCmdMapping.java 注解值处理方法级的 所以 用不到combine
*/
@Override
public ApiRequestCondition combine(ApiRequestCondition other) {
this.cmds.addAll(other.cmds);
return new ApiRequestCondition(cmds);
}
/**
* 获取匹配条件,如果return null 时表明不匹配
*/
@Override
public ApiRequestCondition getMatchingCondition(HttpServletRequest request) {
Req_header reqHeader = null;
String reqStr = null;
// 转成Req_header,统一验证、处理等
try {
reqStr = IOUtils.toString(request.getInputStream());
JSONObject reqJson = JSON.parseObject(reqStr);
JSONObject header_json = reqJson.getJSONObject("Req_Header");
reqHeader = JSON.toJavaObject(header_json, Req_header.class);
String cmd = reqHeader.getCmd();
if(cmd != null && !"".equals(cmd)){
if(cmds.contains(cmd)){
return this;
}else {
return null;
}
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 比较哪个条件为最优匹配(由于只有cmd一个条件所以不允许重复注解相同的cmd)
*/
public int compareTo(ApiRequestCondition other, HttpServletRequest request) {
return 0;
}
@Override
protected Collection<?> getContent() {
return cmds;
}
@Override
protected String getToStringInfix() {
return " || ";
}
}
查找HandlerMethod过程
1. 根据url找到RequestMappingInfo
2. 判断这些RequestMappingInfo(Condition)是否符合当前请求
依次判断RequestMappingInfo内部的Condition是否满足当前请求。
ApiRequestCondition#getMatchingCondition
3. 根据匹配的RequestMappingInfo找到对应的HandlerMethod
HandlerMapping返回值
HandlerExecutionChain包含HandlerMethod 和 HandlerInterceptor