Как Spring Framework обнаруживает и регистрирует контроллеры?

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

Ответ

Spring использует механизм сканирования компонентов (Component Scanning), активируемый аннотацией @ComponentScan. При запуске приложения Spring сканирует указанные пакеты (по умолчанию — пакет, содержащий класс с @SpringBootApplication) в поиске классов, помеченных стереотипными аннотациями.

Ключевые аннотации для контроллеров:

  • @Controller — для MVC-контроллеров с поддержкой представлений.
  • @RestController (комбинация @Controller + @ResponseBody) — для REST API.

Процесс обнаружения:

  1. Класс с @SpringBootApplication неявно содержит @ComponentScan.
  2. Spring сканирует класс-пути (classpath) в поиске классов с @Controller, @RestController или @Component.
  3. Найденные классы регистрируются как бины в ApplicationContext.
  4. Для этих бинов создаются прокси, и их методы, аннотированные @RequestMapping, @GetMapping и т.д., маппятся на URL-пути DispatcherServlet.

Пример:

@SpringBootApplication // Включает @ComponentScan
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}

@RestController // Будет обнаружен и зарегистрирован
public class HelloController {
    @GetMapping("/hello")
    public String sayHello() {
        return "Hello World";
    }
}

Почему это важно: Этот механизм избавляет от необходимости ручной регистрации каждого контроллера в XML или конфигурации, обеспечивая конвенцию над конфигурацией.