1. Введение
В этом кратком руководстве мы узнаем о различиях между аннотациями @ComponentScan
и @EnableAutoConfiguration
в Spring Framework.
2. Весенние аннотации
Аннотации упрощают настройку внедрения зависимостей в Spring. Вместо использования XML-файлов конфигурации мы можем использовать аннотации Spring Bean для классов и методов для определения bean-компонентов . После этого контейнер Spring IoC настраивает компоненты и управляет ими.
Вот обзор аннотаций, которые мы собираемся обсудить в этой статье:
@ComponentScan
сканирует аннотированные компоненты Spring@EnableAutoConfiguration
используется для включения автоматической настройки
Давайте теперь рассмотрим разницу между этими двумя аннотациями.
3. Чем они отличаются
Основное различие между этими аннотациями заключается в том, что @ComponentScan
сканирует компоненты Spring, а @EnableAutoConfiguration
используется для автоматической настройки bean-компонентов, присутствующих в пути к классам в приложениях Spring Boot .
Теперь давайте пройдемся по ним более подробно.
3.1. @ComponentScan
При разработке приложения нам нужно указать платформе Spring искать компоненты, управляемые 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.foreach.annotations.componentscanautoconfigure;
// ...
@Configuration
@ComponentScan(basePackages = {"com.foreach.annotations.componentscanautoconfigure.healthcare",
"com.foreach.annotations.componentscanautoconfigure.employee"},
basePackageClasses = Teacher.class)
public class EmployeeApplication {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args);
// ...
}
}
В этом примере Spring будет сканировать пакеты для здравоохранения
и сотрудников, а также класс «
Учитель
» на наличие компонентов.
Spring ищет указанные пакеты вместе со всеми его подпакетами для классов, аннотированных с помощью @Configuration
.
Кроме того ,
классы Configuration
могут содержать аннотации @Bean
, которые регистрируют методы как bean-компоненты в контексте приложения Spring . После этого аннотация @ComponentScan
может автоматически определять такие bean-компоненты:
@Configuration
public class Hospital {
@Bean
public Doctor getDoctor() {
return new Doctor();
}
}
Кроме того, аннотация @ComponentScan
также может сканировать, обнаруживать и регистрировать bean-компоненты для классов, аннотированных с помощью @Component, @Controller, @Service
и @Repository
.
Например, мы можем создать класс Employee
как компонент, который можно сканировать с помощью аннотации @ ComponentScan :
@Component("employee")
public class Employee {
// ...
}
3.2. @EnableAutoConfiguration
Аннотация @EnableAutoConfiguration
позволяет Spring Boot автоматически настраивать контекст приложения . Поэтому он автоматически создает и регистрирует bean-компоненты на основе как включенных файлов jar в пути к классам, так и bean-компонентов, определенных нами.
Например, когда мы определяем зависимость 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);
// ...
}
}
Мы можем использовать excludeName
для определения полного списка имен классов, которые мы хотим исключить из автоматической настройки:
@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 .