Как работает аннотация @ComponentScan в Spring?

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

Ответ

Аннотация @ComponentScan инструктирует Spring-контейнер, в каких пакетах искать классы, помеченные стереотипными аннотациями, чтобы автоматически зарегистрировать их как бины в ApplicationContext.

Какие аннотации обнаруживает @ComponentScan:

  • @Component
  • @Service
  • @Repository
  • @Controller
  • @Configuration (классы, помеченные этой аннотацией, также обнаруживаются)

Базовый пример:

@Configuration
@ComponentScan("com.example.app") // Сканирует пакет `com.example.app` и все его подпакеты
public class AppConfig {
}

Если пакет не указан, сканирование начинается с пакета, в котором объявлен класс с @ComponentScan.

Точная настройка области сканирования:

@Configuration
@ComponentScan(
    basePackages = {"com.example.service", "com.example.repository"},
    basePackageClasses = {UserService.class} // Сканирует пакет этого класса
)
public class AppConfig {
}

Фильтрация компонентов: Можно использовать атрибуты includeFilters и excludeFilters для тонкого контроля.

@ComponentScan(
    basePackages = "com.example",
    excludeFilters = @ComponentScan.Filter(
        type = FilterType.ANNOTATION,
        classes = {Controller.class}
    ) // Исключает все @Controller-классы из сканирования
)

Важно: Избыточное или слишком широкое сканирование ("com.example" вместо "com.example.service") может значительно замедлить запуск приложения. Всегда указывайте максимально конкретные пакеты.