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.foreach.demopackage")
public class EntityScanDemo {
// ...
}
Мы должны знать, что использование @EntityScan
отключит сканирование автоконфигурации Spring Boot для сущностей.
3. @ComponentScan
Аннотация
Подобно @EntityScan
и сущностям, если мы хотим, чтобы Spring использовал только определенный набор классов компонентов, мы должны использовать аннотацию @ComponentScan
. Он будет указывать на конкретное расположение классов bean-компонентов, которые мы хотели бы, чтобы Spring инициализировал .
Эту аннотацию можно использовать с параметрами или без них. Без параметров Spring будет сканировать текущий пакет и его подпакеты, а при параметризации сообщит Spring, где именно искать пакеты.
Что касается параметров, мы можем предоставить список пакетов для сканирования (используя параметр basePackages
) или мы можем указать конкретные классы, к которым пакеты, к которым они принадлежат, также будут сканироваться (используя параметр basePackageClasses
).
Давайте посмотрим на пример использования аннотации @ComponentScan:
@Configuration
@ComponentScan(
basePackages = {"com.foreach.demopackage"},
basePackageClasses = DemoBean.class)
public class ComponentScanExample {
// ...
}
4. @EntityScan
против @ComponentScan
В итоге можно сказать, что эти две аннотации предназначены для совершенно разных целей.
Их сходство заключается в том, что они оба вносят свой вклад в конфигурацию нашего приложения Spring. @EntityScan
должен указать, какие пакеты мы хотим сканировать на наличие классов сущностей. С другой стороны, @ComponentScan
— это выбор при указании того, какие пакеты следует сканировать на наличие компонентов Spring.
5. Вывод
В этом коротком руководстве мы обсудили использование аннотаций @EntityScan
и @ComponentScan,
а также указали на их различия.