我们从DispatchServlet.doDispatch()中可以看到如下源码:
mappedHandler = this.getHandler(processedRequest);
@Nullable
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
if (this.handlerMappings != null) {
Iterator var2 = this.handlerMappings.iterator();
while(var2.hasNext()) {
HandlerMapping mapping = (HandlerMapping)var2.next();
HandlerExecutionChain handler = mapping.getHandler(request);
if (handler != null) {
return handler;
}
}
}
return null;
}
那么我们来了解下HandlerMapping是怎么初始化和怎么工作的:
首先,我们看下HandlerMapping的分支:

image.png
由上图可以知道我们的HandlerMapping可以分为Url和HandlerMethod两个体系。
URL体系
URL体系初始化流程

image.png
SimpleUrlHandlerMapping从继承图可以看出,在ApplicationContext容器初始化的时候将会对SimpleUrlHandlerMapping进行初始化。
SimpleUrlHandlerMapping 初始化流程如下图:

image.png
URL体系处理请求流程

image.png
1,从DispatcherServlet.doDispatch中调用getHandler方法
2,getHandler方法中遍历所有的HandlerMapping对象,并调用其getHandler方法获取HandlerExecutionChain对象
3,SimpleUrlHandlerMapping对象在初始化时将uri和对应的controller名称保存在了一个handlerMap中,lookupHandler会解析请求获取uri,然后获取controller名称,从beanFactory中获取controller对象,最后将contoller封装成一个HandlerExecutionChain返回。