RequestMappingHandlerMapping 比 DefaultAnnotationHandlerMapping(DispatcherServlet的默认策略,但Spring 3.2不再推荐使用)更强大
可以看出这是一个桥接模式,其中PathMatcher、CorsProcessor、HandlerMethodMappingNamingStrategy都是接口,它们独立于HandlerMapping,使得两者都可以自由地变化
HandlerMapping 接口的唯一一个方法是getHandler(),查看 AbstractHandlerMapping 所实现的 getHandler() 源码
//DispatcherServlet 调用此方法来获取匹配request的Handler
@Override
public final HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
//获取Handler(处理器)
Object handler = getHandlerInternal(request);
if (handler == null) {
handler = getDefaultHandler();
}
if (handler == null) {
return null;
}
//如果handler是字符串,将它视为Bean的名字,并从容器中获取对应的Bean
if (handler instanceof String) {
String handlerName = (String) handler;
handler = getApplicationContext().getBean(handlerName);
}
//将handler封装成HandlerExecutionChain(包含了处理器对象和任意的拦截器)
HandlerExecutionChain executionChain = getHandlerExecutionChain(handler, request);
//CORS(跨域资源共享)协议
if (CorsUtils.isCorsRequest(request)) {
CorsConfiguration globalConfig = this.globalCorsConfigSource.getCorsConfiguration(request);
CorsConfiguration handlerConfig = getCorsConfiguration(handler, request);
CorsConfiguration config = (globalConfig != null ? globalConfig.combine(handlerConfig) : handlerConfig);
executionChain = getCorsHandlerExecutionChain(request, executionChain, config);
}
return executionChain;
}
//抽象方法,由子类实现
protected abstract Object getHandlerInternal(HttpServletRequest request)