首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring MVC RequestMapping 解析全流程:從 HandlerMapping 到 HandlerExecutionChain

     編輯:Java 綜合教學

核心接口:HandlerMapping

定義請求到處理器的映射策略,核心方法:

HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;

關鍵屬性

  • PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE:URL 在映射中的路徑
  • BEST_MATCHING_PATTERN_ATTRIBUTE:最佳匹配模式
  • INTROSPECT_TYPE_LEVEL_MAPPING:是否支援類級別映射
  • URI_TEMPLATE_VARIABLES_ATTRIBUTE:URI 模板變量
  • MATRIX_VARIABLES_ATTRIBUTE:矩陣變量
  • PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE:可生產媒體類型

抽象基類:AbstractHandlerMapping

實現 Ordered 接口定義優先級(值越小優先級越高),提供模板方法:

public final HandlerExecutionChain getHandler(HttpServletRequest request) {
    Object handler = getHandlerInternal(request);  // 子類實現具體映射邏輯
    if (handler == null) handler = getDefaultHandler();
    if (handler == null) return null;
    if (handler instanceof String) {
        handler = getApplicationContext().getBean((String) handler);
    }
    return getHandlerExecutionChain(handler, request);  // 封裝攔截器鏈
}

擴展點

  • getHandlerInternal():核心映射邏輯,子類實現
  • extendInterceptors():子類自定義攔截器處理

主流實現類對比

HandlerExecutionChain 角色

封裝 Handler(處理器)+ Interceptor[](攔截器鏈),代理執行:

  1. 前置處理 preHandle()(全部返回 true 才繼續)
  2. 執行目標 Handler
  3. 後置處理 postHandle()
  4. 完成處理 afterCompletion()

請求處理入口總結

  1. DispatcherServlet 接收請求
  2. 遍歷 HandlerMapping 列表(按 Ordered 排序)
  3. 首個返回非空 HandlerExecutionChain 的映射器勝出
  4. 執行攔截器鏈與目標 Handler

這一步相當於 Spring MVC 的「大門」,決定了請求如何路由到具體業務代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
實現類特點適用場景
BeanNameUrlHandlerMappingBean 名稱作為 URL傳統簡單映射
SimpleUrlHandlerMappingXML 顯式配置 URL-Bean 映射集中式配置
RequestMappingHandlerMapping掃描 @RequestMapping 註解現代註解驅動開發(默認)