Ответ
DispatcherServlet находит контроллеры через механизм сканирования компонентов Spring (component scanning), который активируется соответствующей конфигурацией.
Необходимые условия:
-
Конфигурация сканирования пакетов:
- Java Config: Использование аннотации
@ComponentScanв классе конфигурации.@Configuration @ComponentScan("com.example.controllers") // Указывает пакет для сканирования @EnableWebMvc // Включает поддержку аннотаций MVC public class WebConfig implements WebMvcConfigurer { // ... } - XML Config: Использование элемента
<context:component-scan>в контексте Spring.<context:component-scan base-package="com.example.controllers"/> <mvc:annotation-driven/>
- Java Config: Использование аннотации
-
Наличие аннотации
@Controller(или@RestController): Класс должен быть помечен этой стереотипной аннотацией, которая является специализацией@Component.@Controller // Будет обнаружен при сканировании пакета "com.example.controllers" public class UserController { // ... } -
Регистрация методов обработчиков: Методы в контроллере должны быть помечены аннотациями маппинга запросов (
@GetMapping,@PostMapping,@RequestMappingи т.д.).
Процесс:
- При старте приложения Spring сканирует указанные пакеты.
- Классы с
@Controllerрегистрируются как бины вApplicationContext. DispatcherServletполучает доступ к этому контексту.- Внутренний компонент
HandlerMapping(по умолчаниюRequestMappingHandlerMapping) индексирует все методы с аннотациями маппинга, связывая URL-шаблоны с конкретными методами контроллеров. - Когда приходит HTTP-запрос,
DispatcherServletзапрашивает уHandlerMappingподходящий обработчик (контроллер + метод) и вызывает его.
Если сканирование не настроено или контроллер находится вне сканируемых пакетов, DispatcherServlet его не обнаружит.