Как DispatcherServlet в Spring MVC находит контроллеры?

«Как DispatcherServlet в Spring MVC находит контроллеры?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

DispatcherServlet находит контроллеры через механизм сканирования компонентов Spring и последующего сопоставления запросов.

Процесс состоит из двух ключевых шагов:

  1. Обнаружение бинов-контроллеров: Spring сканирует classpath в поиске классов, помеченных аннотациями @Controller или @RestController. Область сканирования задается:

    • В конфигурации Java: @ComponentScan("com.example.controllers")
    • В XML: <context:component-scan base-package="com.example.controllers"/>
  2. Сопоставление запросов с методами: После создания бинов, DispatcherServlet использует HandlerMapping (по умолчанию RequestMappingHandlerMapping). Этот компонент анализирует аннотации @RequestMapping и ее производные (@GetMapping, @PostMapping и т.д.) на методах контроллеров, строя карту соответствия URL → метод обработчика.

Пример контроллера:

@RestController
@RequestMapping("/api") // Базовый путь
public class UserController {
    @GetMapping("/users/{id}") // Сопоставление с GET /api/users/123
    public User getUser(@PathVariable Long id) {
        // ... логика
    }
}