許多開發者熟悉 @RequestMapping 與 HandlerInterceptor,但對 HandlerMapping 與 HandlerAdapter 的核心協作關係理解不深。本文從 DispatcherServlet 初始化與 doDispatch 流程切入,結合原始碼與時序圖,徹底釐清兩者職責與互動細節。
applicationContext.xml):載入 Service、DAO、DataSource、Redis 等非 Web 組件。mvc-dispatcher-servlet.xml):載入 Controller、ViewResolver、HandlerMapping/Adapter 等 Web 組件。
@Override
protected void onRefresh(ApplicationContext context) {
initStrategies(context);
}
protected void initStrategies(ApplicationContext context) {
initHandlerMappings(context); // 載入所有 HandlerMapping
initHandlerAdapters(context); // 載入所有 HandlerAdapter
// ... 其他策略
}
透過 BeanFactoryUtils.beansOfTypeIncludingAncestors 掃描容器中所有 HandlerMapping 實現,重點為 RequestMappingHandlerMapping,它會掃描所有 @RequestMapping 註解,建立 mappingRegistry(URL → HandlerMethod 映射表)。

同樣掃描容器中所有 HandlerAdapter 實現,預設包含 RequestMappingHandlerAdapter、HttpRequestHandlerAdapter、SimpleControllerHandlerAdapter。RequestMappingHandlerAdapter 內部持有:
argumentResolvers:方法參數解析器(@PathVariable、@RequestParam、@RequestBody 等)returnValueHandlers:返回值處理器messageConverters:訊息轉換器(JSON/XML/表單)
doDispatchprotected void doDispatch(HttpServletRequest request, HttpServletResponse response) {
// 1. 獲取 Handler(Controller 方法封裝)
mappedHandler = getHandler(processedRequest);
if (mappedHandler == null) { noHandlerFound(...); return; }
// 2. 根據 Handler 類型獲取對應的 HandlerAdapter
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
// 3. 委派 Adapter 執行真實 Handler,得到 ModelAndView
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
// ... 後續視圖渲染
}
getHandler:遍歷 handlerMappings,匹配 URL → 返回 HandlerExecutionChain(含 Handler 與攔截器鏈)。getHandlerAdapter:遍歷 handlerAdapters,找到 supports(handler) 為 true 的 Adapter。ha.handle(...):Adapter 執行攔截器 preHandle → 調用 Handler 方法(參數解析、型別轉換) → 執行 postHandle → 返回 ModelAndView。
| 維度 | HandlerMapping | HandlerAdapter |
|---|---|---|
| 職責 | 「找人」:根據請求 URL 找到對應的 Handler(Controller 方法) | 「用人」:知道如何調用該 Handler(參數綁定、返回值處理、異常處理) |
| 核心方法 | getHandler(request) | handle(request, response, handler) |
| 關鍵實現 | RequestMappingHandlerMapping | RequestMappingHandlerAdapter |
| 註冊資訊 | URL → HandlerMethod 映射表 | 參數解析器、返回值處理器、訊息轉換器 |
| 擴展點 | 自定義 URL 匹配規則 | 自定義參數/返回值/轉換邏輯 |
HandlerMapping 可實現動態路由、多租戶 URL 隔離。HandlerAdapter 可支援非標準 Controller 介面(如函數式處理器)。參考:Spring MVC HandlerMapping 與 HandlerAdapter 詳細分析