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.