Разлика между @ComponentScan и @EnableAutoConfiguration в Spring Boot

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 ще сканира пакетите за здравеопазване и служители и класа Teacher за компоненти.

Spring търси посочените пакети заедно с всички негови подпакети за класове, анотирани с @Configuration . Освен това , най- конфигурация класовете могат да съдържат @Bean анотации, които се регистрират на методите като боб в контекста на приложението пролет . След това анотацията @ 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 анотацията позволява Пролет 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); // ... } }

Можем да използваме 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.