在 Spring Boot(Spring MVC)中,一个请求经过 servlet container、一条 Filters 链、中央的 DispatcherServlet,然后是 interceptors 和你的 @Controller,返回值被转换成 HTTP 响应。
Servlet container (Tomcat)
▼
Filter chain ── (CharacterEncoding, Security, CORS, ...)
▼
DispatcherServlet ── front controller
▼
HandlerMapping ── 找到 @Controller 方法
▼
HandlerInterceptor.preHandle
▼
Argument resolvers ── bind @RequestBody / @PathVariable / @RequestParam
▼
Controller method ── 你的逻辑 → 返回 object 或 ResponseEntity
▼
HandlerInterceptor.postHandle
▼
HttpMessageConverter / ViewResolver ── serialize 成 JSON 或 render view
▼
HandlerInterceptor.afterCompletion → Response ──▶ client
Filter 链。Filters(包括 Spring Security)是最外层,可以在 MVC 看到请求之前阻止或包裹它。preHandle — HandlerInterceptor 在 controller 之前运行(auth 检查、logging、计时);返回 false 会停止请求。@PathVariable、@RequestParam 和 @RequestBody(通过 HttpMessageConverter)被 bind 并 validate。@RestController 方法运行业务逻辑并返回一个 object 或 ResponseEntity。postHandle,然后返回值由一个 HttpMessageConverter(通过 Jackson 转成 JSON)进行 serialize,或由一个 ViewResolver render 一个 view。afterCompletion 在响应被 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. serialize 成 JSON
}
}
Spring 的 lifecycle 有两个面试官爱探究的独立扩展层:Filters(servlet 级别、最外层——Spring Security 所在之处)和 Interceptors(Spring MVC 级别、围绕 controller)。了解顺序——filters、DispatcherServlet、mapping、interceptor preHandle、argument binding、controller、message conversion、afterCompletion——能告诉你把身份验证与 logging 分别放在哪里,为什么一个 Security filter 会在任何 interceptor 或 controller 运行之前拒绝一个请求,以及 @ControllerAdvice 如何在整个流程中集中处理异常。
一个包含详细解答的 IT 面试题库——从初级到高级。
捐赠