Рубрики
Без рубрики

Весна @EntityScan vs. @ComponentScan

Автор оригинала: Maja Joksovic.

1. введение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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