HandlerMapping

我們從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返回。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容