Что делает аннотация @ComponentScan в Spring и как её использовать?

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

Ответ

@ComponentScan — это аннотация Spring, которая автоматически обнаруживает и регистрирует Spring-компоненты (бины) в контексте приложения, сканируя указанные пакеты.

Как работает:

  1. Сканирует классы в указанных пакетах.
  2. Находит классы, помеченные стереотипными аннотациями:
    • @Component
    • @Service
    • @Repository
    • @Controller
    • @Configuration
  3. Регистрирует их как бины в ApplicationContext.

Базовое использование:

@Configuration
@ComponentScan("com.example.service", "com.example.repository")
public class AppConfig {
    // Дополнительная конфигурация бинов
}

Расширенные настройки:

@Configuration
@ComponentScan(
    basePackages = {"com.example"},
    basePackageClasses = {UserService.class}, // Пакет этого класса будет базовым
    includeFilters = @Filter(type = FilterType.REGEX, pattern = ".*Service"),
    excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = Repository.class)
)
public class AppConfig {}

Ключевые моменты:

  • Spring Boot: Аннотация @SpringBootApplication уже включает @ComponentScan, сканируя пакет, в котором находится главный класс, и все его подпакеты.
  • Производительность: Избыточное сканирование больших пакетов может замедлить запуск приложения.
  • Конфликты: Может привести к дублированию бинов, если сканируются пересекающиеся области.
  • Альтернатива: Для точного контроля можно регистрировать бины вручную с помощью @Bean в классах конфигурации.