«1. Введение

При написании нашего приложения Spring нам может понадобиться указать определенный список пакетов, содержащих наши классы сущностей. Точно так же в какой-то момент нам понадобится только определенный список наших компонентов Spring для инициализации. Здесь мы можем использовать аннотации @EntityScan или @ComponentScan.

Чтобы пояснить используемые здесь термины, компоненты — это классы с аннотациями @Controller, @Service, @Repository, @Component, @Bean и т. д. Сущности — это классы, отмеченные аннотацией @Entity.

В этом коротком руководстве мы обсудим использование @EntityScan и @ComponentScan в Spring, объясним, для чего они используются, а затем укажем на их различия.

2. Аннотация @EntityScan

При написании нашего приложения Spring у нас обычно будут классы сущностей — те, которые аннотированы аннотацией @Entity. Мы можем рассмотреть два подхода к размещению наших классов сущностей:

    Под основным пакетом приложения или его подпакетами Использовать совершенно другой корневой пакет

В первом сценарии мы могли бы использовать @EnableAutoConfiguration, чтобы позволить Spring автоматически настраивать контекст приложения.

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

Аннотация @EntityScan используется, когда классы сущностей не помещены в основной пакет приложения или его подпакеты. В этой ситуации мы бы объявили пакет или список пакетов в основном классе конфигурации в аннотации @EntityScan. Это сообщит Spring, где найти объекты, используемые в нашем приложении:

@Configuration
@EntityScan("com.baeldung.demopackage")
public class EntityScanDemo {
    // ...
}

Мы должны знать, что использование @EntityScan отключит сканирование автоконфигурации Spring Boot для объектов.

3. Аннотация @ComponentScan

Подобно @EntityScan и сущностям, если мы хотим, чтобы Spring использовал только определенный набор классов компонентов, мы должны использовать аннотацию @ComponentScan. Он укажет на конкретное расположение классов bean-компонентов, которые мы хотели бы, чтобы Spring инициализировал.

Эту аннотацию можно использовать как с параметрами, так и без них. Без параметров Spring будет сканировать текущий пакет и его подпакеты, а при параметризации сообщит Spring, где именно искать пакеты.

Что касается параметров, мы можем указать список пакетов для сканирования (используя параметр basePackages) или указать конкретные классы, к которым пакеты также будут сканироваться (используя параметр basePackageClasses).

Давайте посмотрим на пример использования аннотации @ComponentScan:

@Configuration
@ComponentScan(
  basePackages = {"com.baeldung.demopackage"}, 
  basePackageClasses = DemoBean.class)
public class ComponentScanExample {
    // ...
}

4. @EntityScan против @ComponentScan

В итоге можно сказать, что эти две аннотации предназначены для совершенно разных целей.

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

5. Заключение

В этом кратком руководстве мы обсудили использование аннотаций @EntityScan и @ComponentScan, а также указали на их различия.