28、請求處理-【源碼分析】-請求映射原理
Spring Boot 的請求映射原理主要基于 Spring MVC 框架,通過 `DispatcherServlet` 前端控制器實現。以下是詳細的請求映射過程:
### 1. 請求進入 `DispatcherServlet`
當客戶端發送請求時,首先由 `DispatcherServlet` 接收。`DispatcherServlet` 是 Spring MVC 的核心,負責處理所有進入應用的請求。
### 2. 查找處理器映射 (`HandlerMapping`)
`DispatcherServlet` 調用 `getHandler(HttpServletRequest request)` 方法,遍歷配置的 `HandlerMapping` 列表,查找能夠處理當前請求的處理器。
#### `HandlerMapping` 類型
Spring Boot 默認配置了多個 `HandlerMapping`:
- **`RequestMappingHandlerMapping`**:最重要的映射器,負責處理 `@RequestMapping` 注解標記的控制器方法。保存了所有 `@RequestMapping` 注解與處理方法的映射關系。
- **`WelcomePageHandlerMapping`**:處理根路徑 (`/`) 請求,映射到默認的歡迎頁面(如 `index.html`)。
- **`BeanNameUrlHandlerMapping`**:將 Bean 名稱作為 URL 進行映射。
- **`SimpleUrlHandlerMapping`**:通過配置文件顯式定義的簡單 URL 映射。
- **`RouterFunctionMapping`**:處理基于函數式編程的 WebFlux 路由。
### 3. 匹配請求路徑和處理方法
`RequestMappingHandlerMapping` 根據請求的路徑、HTTP 方法、請求參數等信息,匹配最適合的處理方法。匹配規則包括:
- **URL 路徑匹配**:精確匹配、通配符匹配 (`*`)、路徑變量 (`/{variable}`)、正則表達式 (`/{regex:pattern}`)。
- **HTTP 方法匹配**:`GET`、`POST`、`PUT`、`DELETE` 等。
- **請求頭匹配**:通過 `@RequestMapping` 的 `headers` 屬性指定。
- **請求參數匹配**:通過 `params` 屬性指定。
### 4. 確定處理方法和攔截器
一旦找到匹配的處理器,`HandlerMapping` 返回一個 `HandlerExecutionChain`,包含處理方法和相關的攔截器(`HandlerInterceptor`)。
### 5. 調用處理器適配器 (`HandlerAdapter`)
`DispatcherServlet` 根據處理方法的類型,選擇合適的 `HandlerAdapter` 執行處理方法。常見的適配器有:
- **`RequestMappingHandlerAdapter`**:處理 `@RequestMapping` 注解的方法。
- **`SimpleControllerHandlerAdapter`**:處理實現 `Controller` 接口的類。
### 6. 執行處理方法
`HandlerAdapter` 調用處理方法,并處理參數解析和返回值處理:
- **參數解析**:使用 `HandlerMethodArgumentResolver` 解析請求參數,支持多種參數類型,如請求體 (`@RequestBody`)、路徑變量 (`@PathVariable`)、請求頭 (`@RequestHeader`) 等。
- **返回值處理**:使用 `HandlerMethodReturnValueHandler` 處理返回值,支持視圖解析、JSON 序列化等。
### 7. 返回結果
處理方法執行后,返回 `ModelAndView` 對象或直接返回數據。`DispatcherServlet` 根據返回值進行視圖渲染或直接響應數據給客戶端。
### 總結
Spring Boot 的請求映射原理通過 `DispatcherServlet`、`HandlerMapping`、`HandlerAdapter` 等組件協同工作,實現了請求路徑與處理方法的映射,以及請求參數和返回值的處理。開發者可以通過 `@RequestMapping` 等注解靈活配置請求映射規則,構建 RESTful API 和 Web 應用。
---
通過以上步驟,Spring Boot 完成了從接收請求到返回響應的整個流程,實現了高效、靈活的請求處理機制。