Spring Boot(Spring MVC)では、リクエストは servlet container、Filter のチェーン、中央の DispatcherServlet、そして interceptor とあなたの @Controller を通過し、戻り値が HTTP レスポンスに変換されます。
Servlet container (Tomcat)
▼
Filter chain ── (CharacterEncoding, Security, CORS, ...)
▼
DispatcherServlet ── front controller
▼
HandlerMapping ── @Controller メソッドを探す
▼
HandlerInterceptor.preHandle
▼
Argument resolvers ── @RequestBody / @PathVariable / @RequestParam を bind
▼
Controller method ── あなたのロジック → object または ResponseEntity を返す
▼
HandlerInterceptor.postHandle
▼
HttpMessageConverter / ViewResolver ── JSON にシリアライズ または view をレンダリング
▼
HandlerInterceptor.afterCompletion → Response ──▶ client
Filter チェーンに渡します。Filter(Spring Security を含む)は最も外側のレイヤーで、MVC が見る前にリクエストをブロックまたはラップできます。preHandle — HandlerInterceptor が controller の前に実行されます(auth チェック、logging、タイミング計測)。false を返すとリクエストが停止します。@PathVariable、@RequestParam、@RequestBody(HttpMessageConverter 経由)が bind され、検証されます。@RestController メソッドがビジネスロジックを実行し、object または ResponseEntity を返します。postHandle、その後、戻り値は HttpMessageConverter によってシリアライズされる(Jackson 経由の JSON)か、ViewResolver によって view がレンダリングされます。afterCompletion は response が commit された後に実行されます。@ExceptionHandler/@ControllerAdvice が途中で例外を処理します。// 4/7/8. interceptor
public class TimingInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object h) {
req.setAttribute("started", System.nanoTime());
return true; // false = ショートサーキット
}
}
// 6. controller
@RestController
class ItemController {
@GetMapping("/items/{id}") // 3. mapping
ResponseEntity<Item> show(@PathVariable Long id) { // 5. argument resolution
return ResponseEntity.ok(service.find(id)); // 7. JSON にシリアライズ
}
}
Spring のライフサイクルには、面接官が探りを入れたがる 2 つの明確な拡張レイヤーがあります。Filter(servlet レベル、最も外側 — Spring Security が存在する場所)と Interceptor(Spring MVC レベル、controller の周囲)です。順序 — filter、DispatcherServlet、mapping、interceptor preHandle、argument の binding、controller、message 変換、afterCompletion — を知っていれば、認証と logging をどこに置くべきか、なぜ Security filter がどの interceptor や controller よりも前にリクエストを拒否するのか、そして @ControllerAdvice がどのようにフロー全体で例外処理を一元化するのかが分かります。
ジュニアからシニアまで、詳細な回答付きのIT面接質問ライブラリ。
寄付する