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

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

Ответ

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

Механизм работы:

  1. Стартовая точка: Сканирование начинается с пакета, указанного в basePackages или basePackageClasses. Если пакет не задан, используется пакет класса, аннотированного @ComponentScan.
  2. Поиск компонентов: Spring просматривает все классы в указанных пакетах (и их подпакетах) в classpath.
  3. Идентификация: Классы, аннотированные как @Component, @Service, @Repository, @Controller, @Configuration, обнаруживаются и регистрируются в ApplicationContext.

Пример конфигурации:

@Configuration
@ComponentScan(
    basePackages = {"com.example.service", "com.example.repository"},
    excludeFilters = @ComponentScan.Filter(
        type = FilterType.ANNOTATION,
        classes = {Configuration.class}
    )
)
public class AppConfig {}

Ключевые параметры для настройки:

  • basePackages / basePackageClasses: Задает пакеты для сканирования.
  • includeFilters: Позволяет включать классы, даже если у них нет стандартных Spring-аннотаций (например, с помощью кастомных аннотаций).
  • excludeFilters: Позволяет исключать определенные классы из сканирования.

Важно: В Spring Boot @ComponentScan неявно используется аннотацией @SpringBootApplication, которая сканирует все подпакеты от класса с этой аннотацией.