Перейти к основному содержимому

Разница между @ComponentScan и @EnableAutoConfiguration в Spring Boot

· 4 мин. чтения

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 .