目录
  1. HandlerMapping接口
  2. AbstractHandlerMapping类
  3. 总结
springMVC(3) HandlerMapping及其抽象实现

HandlerMapping接口

HandlerMapping是用来处理请求与handler对象的对应关系的。

HandlerMapping主要包含getHandler这个方法。

1
HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;

DispatcherServlet就是通过调用HandlerMapping的getHandler来进行找到request对应的handler的。

AbstractHandlerMapping类

AbstractHandlerMapping是实现HandlerMapping接口的抽象基类。

首先我们来看其中的getHandler方法:

如果不考虑类中的跨域请求的处理。那么我们可以只关注下面两个方法,getHandlerExecutionChain和getHandler。因为getHandler中调用了getHandlerExecutionChain,所以我们先来看一下getHandlerExecutionChain方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
protected HandlerExecutionChain getHandlerExecutionChain(Object handler, HttpServletRequest request) {
HandlerExecutionChain chain = (handler instanceof HandlerExecutionChain ?
(HandlerExecutionChain) handler : new HandlerExecutionChain(handler));

String lookupPath = this.urlPathHelper.getLookupPathForRequest(request);
for (HandlerInterceptor interceptor : this.adaptedInterceptors) {
if (interceptor instanceof MappedInterceptor) {
MappedInterceptor mappedInterceptor = (MappedInterceptor) interceptor;
if (mappedInterceptor.matches(lookupPath, this.pathMatcher)) {
chain.addInterceptor(mappedInterceptor.getInterceptor());
}
}
else {
chain.addInterceptor(interceptor);
}
}
return chain;
}

这段代码的意思就是 找到该handler的所有对应MappedInterceptor并将其与handler组合成HandlerExecutionChain,当然还包括所有的非MappedInterceptor类型的HandlerInterceptor。

简言之,就是返回handler所对应的HandlerExecutionChain。

然后我们就来阅读getHandler部分的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public final HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
Object handler = getHandlerInternal(request);
if (handler == null) {
handler = getDefaultHandler();
}
if (handler == null) {
return null;
}
// Bean name or resolved handler?
if (handler instanceof String) {
String handlerName = (String) handler;
handler = obtainApplicationContext().getBean(handlerName);
}

HandlerExecutionChain executionChain = getHandlerExecutionChain(handler, request);
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;
}

这段代码的意思就是从request中抽离出handler并调用getHandlerExecutionChain方法组装。(其中getHandlerInternal是一种抽象方法)。

总结

我们可以从上面的代码中总结出整个HandlerMapping的设计思路。

首先[request]由[AbstractHandlerMapping的实现类]处理得到其对应的[handler],接着[handler]由[AbstractHandlerMapping]找到其对应的所有拦截器并包装成[HandlerExecutionChain]返回。

文章作者: 谷河
文章链接: https://www.lyytaw.com/spring/springMVC(3)-HandlerMapping%E5%8F%8A%E5%85%B6%E6%8A%BD%E8%B1%A1%E5%AE%9E%E7%8E%B0/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 谷河|BLOG