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

Разница между @ComponentScan и @EnableAutoConfiguration в весенней загрузке

Давайте рассмотрим разницу между этими двумя аннотациями для настройки нашего приложения Spring Boot.

Автор оригинала: 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 .