← Назад к вопросам

Как 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

  1. DispatcherServlet получает URL и метод PUT
  2. RequestMappingHandlerMapping ищет в @RequestMapping
  3. Находит: @PutMapping("/users/{id}")
  4. Извлекает: {id} = 123
  5. Выбирает RequestMappingHandlerAdapter
  6. Adapter преобразует параметры
  7. Вызывает updateUser(id, dto)
  8. Сериализует результат в JSON
  9. Отправляет ответ

Регистрация маршрутов

@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

  1. HandlerMapping — находит контроллер
  2. HandlerAdapter — адаптер для вызова
  3. HandlerExceptionResolver — обработка исключений
  4. ViewResolver — преобразование результата
  5. 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 гибким и мощным инструментом.

Как DispatcherServlet определяет тип контроллера | PrepBro