我們從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兩個(gè)體系。
URL體系
URL體系初始化流程

image.png
SimpleUrlHandlerMapping從繼承圖可以看出,在ApplicationContext容器初始化的時(shí)候?qū)impleUrlHandlerMapping進(jìn)行初始化。
SimpleUrlHandlerMapping 初始化流程如下圖:

image.png
URL體系處理請求流程

image.png
1,從DispatcherServlet.doDispatch中調(diào)用getHandler方法
2,getHandler方法中遍歷所有的HandlerMapping對象,并調(diào)用其getHandler方法獲取HandlerExecutionChain對象
3,SimpleUrlHandlerMapping對象在初始化時(shí)將uri和對應(yīng)的controller名稱保存在了一個(gè)handlerMap中,lookupHandler會解析請求獲取uri,然后獲取controller名稱,從beanFactory中獲取controller對象,最后將contoller封裝成一個(gè)HandlerExecutionChain返回。