← Назад к вопросам
Как DispatcherServlet определяет тип контроллера
2.0 Middle🔥 131 комментариев
#REST API и микросервисы#Spring Framework
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Как DispatcherServlet определяет тип контроллера?
DispatcherServlet — главный сервлет Spring MVC, маршрутизирует HTTP запросы на подходящие контроллеры.
7 шагов процесса
1. Получение URL из запроса
DispatcherServlet извлекает URL и HTTP метод из входящего запроса.
2. Поиск HandlerMapping
Итерирует по списку HandlerMapping'ов:
- RequestMappingHandlerMapping (для @RequestMapping)
- BeanNameHandlerMapping (старый подход)
- SimpleUrlHandlerMapping (XML конфигурация)
3. RequestMappingHandlerMapping анализирует @RequestMapping
Ищет контроллер с подходящей аннотацией:
@RestController
@RequestMapping("/api/v1/users")
public class UserController {
@GetMapping
public List<User> getAllUsers() { }
@GetMapping("/{id}")
public User getUserById(@PathVariable UUID id) { }
@PostMapping
public User createUser(@RequestBody UserDTO dto) { }
}
4. Матчинг пути
Spring использует AntPathMatcher для сравнения URL'ов:
- Запрос: GET /api/v1/users/123
- Паттерн: @GetMapping("/users/{id}")
- Результат: совпадение!
5. Извлечение параметров пути
Если паттерн содержит переменные, они извлекаются:
Паттерн: /users/{id}/posts/{postId}
URL: /users/123/posts/456
Результат: {id: 123, postId: 456}
6. Выбор HandlerAdapter
Выбирается адаптер для вызова контроллера:
- RequestMappingHandlerAdapter (для @Controller, @RestController)
- HttpRequestHandlerAdapter (для HttpRequestHandler)
- SimpleControllerHandlerAdapter (для Controller interface)
7. Выполнение контроллера
HandlerAdapter вызывает метод с преобразованными аргументами.
Полный пример
Запрос: PUT /api/v1/users/123
- DispatcherServlet получает URL и метод PUT
- RequestMappingHandlerMapping ищет в @RequestMapping
- Находит: @PutMapping("/users/{id}")
- Извлекает: {id} = 123
- Выбирает RequestMappingHandlerAdapter
- Adapter преобразует параметры
- Вызывает updateUser(id, dto)
- Сериализует результат в JSON
- Отправляет ответ
Регистрация маршрутов
@Component
public class ControllerRegistry {
@EventListener
public void onApplicationEvent(ContextRefreshedEvent event) {
RequestMappingHandlerMapping mapping =
event.getApplicationContext()
.getBean(RequestMappingHandlerMapping.class);
mapping.getHandlerMethods().forEach((m, method) -> {
System.out.println(m + " -> " + method);
});
}
}
Ключевые компоненты DispatcherServlet
- HandlerMapping — находит контроллер
- HandlerAdapter — адаптер для вызова
- HandlerExceptionResolver — обработка исключений
- ViewResolver — преобразование результата
- HttpMessageConverter — сериализация/десериализация
ArgumentResolver'ы
Преобразуют параметры запроса в аргументы метода:
@GetMapping("/users/{id}")
public User getUser(
@PathVariable UUID id,
@RequestParam String filter,
@RequestBody UserDTO dto,
@RequestHeader String token,
HttpServletRequest request
) { }
- PathVariableMethodArgumentResolver — для @PathVariable
- RequestParamMethodArgumentResolver — для @RequestParam
- RequestBodyMethodArgumentResolver — для @RequestBody
- RequestHeaderMethodArgumentResolver — для @RequestHeader
- ServletRequestMethodArgumentResolver — для HttpServletRequest
Заключение
DispatcherServlet определяет контроллер через:
- Поиск подходящего HandlerMapping
- Матчинг пути с URL паттернами
- Извлечение параметров пути
- Выбор HandlerAdapter
- Выполнение метода контроллера
- Преобразование параметров
Этот механизм делает Spring MVC гибким и мощным инструментом.