Forskjellen mellom @ComponentScan og @EnableAutoConfiguration i Spring Boot
1. Introduksjon
I denne raske opplæringen lærer vi om forskjellene mellom @ComponentScan og @EnableAutoConfiguration merknader i vårrammen.
2. Vårkommentarer
Kommentarer gjør det lettere å konfigurere avhengighetsinjeksjonen om våren. I stedet for å bruke XML-konfigurasjonsfiler, kan vi bruke Spring Bean-merknader på klasser og metoder for å definere bønner. Etter det konfigurerer og administrerer vår IoC-beholder bønnene.
Her er en oversikt over kommentarene vi skal diskutere i denne artikkelen:
- @ComponentScan skanner etter merkede fjærkomponenter
- @EnableAutoConfiguration brukes til å aktivere automatisk konfigurasjon
La oss nå se på forskjellen mellom disse to kommentarene.
3. Hvordan de er forskjellige
Hovedforskjellen mellom disse kommentarene er at @ComponentScan skanner etter vårkomponenter mens @EnableAutoConfiguration brukes til automatisk konfigurering av bønner som er tilstede på klassestien i Spring Boot-applikasjoner.
La oss nå gå gjennom dem mer detaljert.
3.1. @ComponentScan
Mens vi utvikler en applikasjon, må vi fortelle Spring-rammeverket å se etter vårstyrte komponenter. @ComponentScan gjør det mulig for Spring å søke etter ting som konfigurasjoner, kontrollere, tjenester og andre komponenter vi definerer.
Spesielt den @ComponentScankommentar brukes med @Konfigurasjon kommentar for å spesifisere pakken for våren for å skanne etter komponenter:
@Configuration @ComponentScan offentlig klasse EmployeeApplication {public static void main (String [] args) {ApplicationContext context = SpringApplication.run (EmployeeApplication.class, args); // ...}}
Alternativt kan Spring også begynne å skanne fra den spesifiserte pakken, som vi kan definere ved hjelp av basePackageClasses () eller basePackages (). Hvis ingen pakke er spesifisert, vurderer den pakken til klassen som erklærer @ComponentScan kommentar som startpakke:
pakke com.baeldung.annotations.componentscanautoconfigure; // ... @Configuration @ComponentScan (basePackages = {"com.baeldung.annotations.componentscanautoconfigure.healthcare", "com.baeldung.annotations.componentscanautoconfigure.employee"}, basePackageClasses = Teacher.class) offentlig klasse ansattes applikasjon {} void main (String [] args) {ApplicationContext context = SpringApplication.run (EmployeeApplication.class, args); // ...}}
I eksemplet vil Spring skanne helsevesen og ansatt pakker og Lærer klasse for komponenter.
Spring søker i de spesifiserte pakkene sammen med alle delpakker etter klasser merket med @Konfigurasjon. I tillegg, de Konfigurasjon klasser kan inneholde @Bønne merknader, som registrerer metodene som bønner i vårapplikasjonssammenheng. Etter det, @ComponentScan merknader kan automatisk oppdage slike bønner:
@Configuration public class Hospital {@Bean public Doctor getDoctor () {return new Doctor (); }}
Videre er @ComponentScan merknader kan også skanne, oppdage og registrere bønner for klasser som er merket med @Komponent, @Kontroller, @Service, og @Oppbevaringssted.
For eksempel kan vi lage en Ansatt klasse som en komponent som kan skannes av @ComponentScan kommentar:
@Component ("ansatt") offentlig klasse ansatt {// ...}
3.2. @EnableAutoConfiguration
De @EnableAutoConfiguration merknader gjør at Spring Boot kan konfigurere applikasjonskonteksten automatisk. Derfor oppretter og registrerer den automatisk bønner basert på både de inkluderte jar-filene i klassestien og bønnene som er definert av oss.
For eksempel når vi definerer spring-boot-starter-web avhengighet i klassestien vår, konfigurerer Spring Boot automatisk Tomcat og Spring MVC. Imidlertid har denne autokonfigurasjonen mindre forrang i tilfelle vi definerer våre egne konfigurasjoner.
Pakken til klassen som erklærer @EnableAutoConfiguration merknader betraktes som standard. Derfor bør vi alltid bruke @EnableAutoConfiguration kommentar i rotpakken slik at alle underpakker og klasser kan undersøkes:
@Configuration @EnableAutoConfiguration offentlig klasse EmployeeApplication {public static void main (String [] args) {ApplicationContext context = SpringApplication.run (EmployeeApplication.class, args); // ...}}
Videre er den @EnableAutoConfiguration kommentar gir to parametere for å manuelt ekskludere alle parametere:
Vi kan bruke utelukke for å deaktivere en liste over klasser som vi ikke ønsker å konfigureres automatisk:
@Configuration @EnableAutoConfiguration (ekskluder = {JdbcTemplateAutoConfiguration.class}) offentlig klasse EmployeeApplication {public static void main (String [] args) {ApplicationContext context = SpringApplication.run (EmployeeApplication.class, args); // ...}}
Vi kan bruke ekskluder Navn for å definere en fullt kvalifisert liste over klassenavn som vi vil ekskludere fra den automatiske konfigurasjonen:
@Configuration @EnableAutoConfiguration (excludeName = {"org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration"}) offentlig klasse EmployeeApplication {public static void main (String [] args) {ApplicationContext context = SpringApplication.run (EmployassApplication.s ); // ...}}
Siden Spring Boot 1.2.0 kan vi bruke @SpringBootApplication kommentar, som er en kombinasjon av de tre kommentarene @Configuration, @EnableAutoConfiguration, og@ComponentScan med standardattributtene:
@SpringBootApplication offentlig klasse EmployeeApplication {public static void main (String [] args) {ApplicationContext context = SpringApplication.run (EmployeeApplication.class, args); // ...}}
4. Konklusjon
I denne artikkelen lærte vi om forskjellene mellom @ComponentScan og @EnableAutoConfiguration i Spring Boot.
Som alltid er koden for disse eksemplene tilgjengelig på GitHub.