HandlerMethod
它封裝了對特定處理器方法的呼叫細節,包括方法的反射資訊、引數解析、返回值處理等。它主要用於 Spring MVC 和 Spring WebFlux 應用程式中,基於註解的控制器方法提供支援。
請求流程所屬環節
業務擔當:
註解驅動的控制器支援:Spring 支援使用註解(如
@RequestMapping
)來簡化控制器方法的定義和請求對映。方法呼叫的封裝:
HandlerMethod
封裝了方法呼叫的細節,使得框架可以在執行時動態呼叫這些方法。引數解析和處理:Spring 需要一種機制來解析進入的請求,並將其轉換為控制器方法所需的引數。
返回值處理:不同的控制器方法可能返回不同型別的資料,
HandlerMethod
需要支援這些返回值的適當處理。非同步支援:Spring 支援非同步請求處理,
HandlerMethod
需要能夠處理這種非同步邏輯。攔截器和異常處理:Spring 的攔截器和異常處理機制需要訪問方法呼叫的上下文資訊。
業務案例:
假設你正在開發一個 RESTful API,用於管理使用者資訊。你想要使用 Spring MVC 來簡化控制器的編寫。
1. 定義一個控制器:
import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/users") public class UserController { @GetMapping("/{id}") public User getUser(@PathVariable Long id) { // 根據使用者ID查詢使用者資訊 return userRepository.findById(id); } @PostMapping public User createUser(@RequestBody User user) { // 建立新使用者 return userRepository.save(user); } }
在這個控制器中,getUser
和 createUser
是 HandlerMethod
的示例。Spring 將這些方法與特定的 HTTP 請求路徑和請求型別關聯起來。
2. 處理 HTTP 請求:
當一個 HTTP 請求到達時,Spring MVC 的 DispatcherServlet
將找到相應的 HandlerMethod
並執行它。
對於
GET /users/{id}
請求,getUser
方法將被呼叫,{id}
將作為路徑變數傳遞給方法。對於
POST /users
請求,createUser
方法將被呼叫,請求體(@RequestBody
)將被解析為User
物件。
3. 使用 HandlerMethod
:
在某些高階用例中,你可能需要直接與 HandlerMethod
互動,例如在自定義的攔截器或異常處理器中:
import org.springframework.web.method.HandlerMethod; // ... public class CustomInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { if (handler instanceof HandlerMethod) { HandlerMethod handlerMethod = (HandlerMethod) handler; // 可以訪問方法、方法引數等 } return true; } }
在這個攔截器中,我們檢查 handler
是否是 HandlerMethod
的例項,這樣就可以訪問到被呼叫的方法及其註解資訊。
使用範圍:
HandlerMethod
為 Spring MVC 和 WebFlux 提供了一種靈活的方式來處理基於註解的控制器方法。它支援複雜的引數解析和返回值處理,簡化了開發過程。
透過
HandlerMethod
,Spring 可以輕鬆地與現代的非同步和非阻塞程式設計模型整合。