Автор оригинала: Anirban Chatterjee.
1. введение
В этом кратком руководстве мы узнаем о различиях между @ComponentScan и @EnableAutoConfiguration аннотациями в Spring Framework.
2. Весенние Аннотации
Аннотации облегчают настройку внедрения зависимостей весной. Вместо использования файлов конфигурации XML мы можем использовать Spring Bean аннотации к классам и методам для определения компонентов . После этого контейнер Spring IoC настраивает бобы и управляет ими.
Вот обзор аннотаций, которые мы собираемся обсудить в этой статье:
- @ComponentScan сканирование аннотированных компонентов Spring
- @EnableAutoConfiguration используется для включения автоматической настройки
Давайте теперь рассмотрим разницу между этими двумя аннотациями.
3. Чем Они Отличаются
Основное различие между этими аннотациями заключается в том, что @ComponentScan сканирует компоненты Spring, в то время как @EnableAutoConfiguration используется для автоматической настройки компонентов, присутствующих в пути к классу в Spring Boot приложениях .
Теперь давайте рассмотрим их более подробно.
3.1. @ComponentScan
При разработке приложения нам нужно указать Spring framework, чтобы он искал компоненты, управляемые Spring. @ComponentScan позволяет Spring сканировать такие вещи, как конфигурации, контроллеры, службы и другие компоненты, которые мы определяем .
В частности, аннотация @ComponentScan используется с аннотацией @Configuration для указания пакета Spring для сканирования компонентов:
@Configuration @ComponentScan public class EmployeeApplication { public static void main(String[] args) { ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args); // ... } }
Кроме того, Spring также может начать сканирование из указанного пакета, который мы можем определить с помощью basePackageClasses() или basePackages() . Если пакет не указан, то он рассматривает пакет класса, объявляющего аннотацию @ComponentScan в качестве начального пакета :
package com.baeldung.annotations.componentscanautoconfigure; // ... @Configuration @ComponentScan(basePackages = {"com.baeldung.annotations.componentscanautoconfigure.healthcare", "com.baeldung.annotations.componentscanautoconfigure.employee"}, basePackageClasses = Teacher.class) public class EmployeeApplication { public static void main(String[] args) { ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args); // ... } }
В этом примере Spring будет сканировать пакеты health care и employee , а также класс Teacher на наличие компонентов.
Spring ищет указанные пакеты вместе со всеми своими подпакетами для классов, аннотированных @Configuration . Дополнительно , классы Конфигурации могут содержать @Bean аннотации, которые регистрируют методы как бобы в контексте приложения Spring . После этого аннотация @ ComponentScan может автоматически обнаруживать такие компоненты:
@Configuration public class Hospital { @Bean public Doctor getDoctor() { return new Doctor(); } }
Кроме того, аннотация @ ComponentScan может также сканировать, обнаруживать и регистрировать компоненты для классов, аннотированных с помощью @Component, @Controller, @Service и @Repository .
Например, мы можем создать класс Employee в качестве компонента, который можно сканировать с помощью аннотации @ ComponentScan :
@Component("employee") public class Employee { // ... }
3.2. @EnableAutoConfiguration
Аннотация @EnableAutoConfiguration позволяет Spring Boot автоматически настраивать контекст приложения . Поэтому он автоматически создает и регистрирует бобы на основе как включенных файлов jar в пути к классу, так и определенных нами бобов.
Например, когда мы определяем зависимость spring-boot-starter-web в нашем пути к классам, Spring boot автоматически настраивает Tomcat и Spring MVC . Однако эта автоматическая конфигурация имеет меньший приоритет в случае, если мы определяем наши собственные конфигурации.
Пакет класса, объявляющего аннотацию @EnableAutoConfiguration , считается по умолчанию . Поэтому мы всегда должны применять аннотацию @EnableAutoConfiguration в корневом пакете, чтобы можно было проверить все подпакеты и классы:
@Configuration @EnableAutoConfiguration public class EmployeeApplication { public static void main(String[] args) { ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args); // ... } }
Кроме того, в аннотации @EnableAutoConfiguration предусмотрены два параметра для ручного исключения любого параметра:
Мы можем использовать exclude , чтобы отключить список классов, которые мы не хотим автоматически настраивать:
@Configuration @EnableAutoConfiguration(exclude={JdbcTemplateAutoConfiguration.class}) public class EmployeeApplication { public static void main(String[] args) { ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args); // ... } }
Мы можем использовать exclude Name для определения полного списка имен классов, которые мы хотим исключить из автоматической конфигурации:
@Configuration @EnableAutoConfiguration(excludeName = {"org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration"}) public class EmployeeApplication { public static void main(String[] args) { ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args); // ... } }
Начиная с Spring Boot 1.2.0, мы можем использовать аннотацию @SpringBootApplication , которая представляет собой комбинацию трех аннотаций @Configuration, @EnableAutoConfiguration, и @ComponentScan с их атрибутами по умолчанию :
@SpringBootApplication public class EmployeeApplication { public static void main(String[] args) { ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args); // ... } }
4. Заключение
В этой статье мы узнали о различиях между @ComponentScan и @EnableAutoConfiguration в Spring Boot.
Как всегда, код для этих примеров доступен на GitHub .