В Spring Boot (Spring MVC) запрос проходит через servlet container, цепочку Filters, центральный DispatcherServlet, затем через interceptors и ваш @Controller, а возвращаемое значение преобразуется в HTTP-ответ.
В 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 ── сериализовать в JSON или отрендерить view
▼
HandlerInterceptor.afterCompletion → Response ──▶ client
Filter. Filters (включая Spring Security) — самый внешний слой, они могут заблокировать или обернуть запрос до того, как его увидит MVC.preHandle — HandlerInterceptor выполняются до контроллера (проверки auth, logging, замер времени); возврат false останавливает запрос.@PathVariable, @RequestParam и @RequestBody (через HttpMessageConverter) связываются (bind) и валидируются.@RestController выполняет бизнес-логику и возвращает объект или ResponseEntity.postHandle, затем возвращаемое значение сериализуется с помощью HttpMessageConverter (JSON через Jackson) или view рендерится с помощью ViewResolver.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. сериализация в JSON
}
}
Жизненный цикл Spring имеет два отдельных слоя расширения, которые интервьюеры любят выспрашивать: Filters (на уровне servlet, самые внешние — где находится Spring Security) и Interceptors (на уровне Spring MVC, вокруг контроллера). Знание порядка — filters, DispatcherServlet, mapping, preHandle интерцептора, связывание аргументов, controller, конвертация сообщения, afterCompletion — подсказывает, где размещать аутентификацию, а где logging, почему Security-фильтр отклоняет запрос до того, как выполнится любой interceptor или controller, и как @ControllerAdvice централизует обработку исключений по всему потоку.
Библиотека вопросов для IT-собеседований с подробными ответами — от Junior до Senior.
Поддержать