Демистификация аннотации @ComponentScan: где она выглядит?

В мире Spring Framework аннотация @ComponentScanиграет решающую роль в обеспечении автоматического обнаружения компонентов. Он сообщает Spring, где искать компоненты, такие как контроллеры, сервисы и репозитории, в вашем приложении. Давайте углубимся в детали этой мощной аннотации и рассмотрим различные способы ее использования для сканирования компонентов.

  1. Сканирование текущего пакета:
    По умолчанию, когда вы используете @ComponentScanбез указания каких-либо базовых пакетов, Spring сканирует текущий пакет и его подпакеты. Например:

    @ComponentScan
    @Configuration
    public class AppConfig {
    // ...
    }

    В этом случае Spring просканирует все компоненты пакета, в котором находится AppConfig.

  2. Указание базовых пакетов.
    Вы можете явно определить базовые пакеты для сканирования компонентов, используя атрибут basePackagesдля @ComponentScan. Например:

    @ComponentScan(basePackages = "com.example")
    @Configuration
    public class AppConfig {
    // ...
    }

    В этом случае Spring просканирует пакет com.exampleи его подпакеты на наличие компонентов.

  3. Использование классов базового пакета.
    Вместо указания базовых пакетов в виде строк вы можете использовать классы в качестве ориентира для сканирования пакетов. Spring просканирует пакет указанного класса и его подпакеты. Например:

    @ComponentScan(basePackageClasses = {ComponentA.class, ComponentB.class})
    @Configuration
    public class AppConfig {
    // ...
    }

    В этом случае Spring просканирует пакеты ComponentAи ComponentB, включая их подпакеты.

  4. Сканирование нескольких базовых пакетов.
    Вы также можете указать несколько базовых пакетов для сканирования компонентов. Например:

    @ComponentScan(basePackages = {"com.example.package1", "com.example.package2"})
    @Configuration
    public class AppConfig {
    // ...
    }

    В этом случае Spring просканирует как com.example.package1, так и com.example.package2вместе с их подпакетами.

  5. Использование фильтров включения и исключения.
    Иногда вам может потребоваться включить или исключить определенные компоненты из сканирования. Этого можно добиться, используя атрибуты includeFiltersи excludeFiltersэлемента @ComponentScan. Например:

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

    В этом случае Spring исключит из сканирования любые компоненты, помеченные @Deprecated.

Аннотация @ComponentScan— это мощный инструмент Spring Framework, который обеспечивает автоматическое обнаружение компонентов. Понимая различные варианты использования, вы можете эффективно контролировать, где Spring ищет компоненты в вашем приложении. Будь то сканирование текущего пакета, указание базовых пакетов, использование классов базового пакета или применение фильтров, @ComponentScanдает вам возможность гибко настроить процесс сканирования компонентов.