Forskellen mellem @ComponentScan og @EnableAutoConfiguration i Spring Boot

1. Introduktion

I denne hurtige vejledning lærer vi om forskellene mellem @ComponentScan og @EnableAutoConfiguration bemærkninger i forårets ramme.

2. Forårsanmærkninger

Kommentarer gør det lettere at konfigurere afhængighedsinjektionen om foråret. I stedet for at bruge XML-konfigurationsfiler kan vi bruge Spring Bean-kommentarer til klasser og metoder til at definere bønner. Derefter konfigurerer og administrerer Spring IoC-containeren bønnerne.

Her er en oversigt over de kommentarer, som vi skal diskutere i denne artikel:

  • @ComponentScan scanner efter kommenterede fjederkomponenter
  • @EnableAutoConfiguration bruges til at aktivere automatisk konfiguration

Lad os nu se på forskellen mellem disse to kommentarer.

3. Hvordan de adskiller sig

Den største forskel mellem disse kommentarer er, at @ComponentScan scanner efter fjederkomponenter, mens @EnableAutoConfiguration bruges til automatisk konfiguration af bønner, der findes på klassestien i Spring Boot-applikationer.

Lad os nu gennemgå dem mere detaljeret.

3.1. @ComponentScan

Mens vi udvikler en applikation, er vi nødt til at fortælle Spring-rammen om at lede efter Spring-managed komponenter. @ComponentScan gør det muligt for Spring at scanne for ting som konfigurationer, controllere, tjenester og andre komponenter, vi definerer.

Især den @ComponentScankommentar bruges med @Konfiguration kommentar for at specificere pakken til Spring for at scanne efter komponenter:

@Configuration @ComponentScan offentlig klasse EmployeeApplication {public static void main (String [] args) {ApplicationContext context = SpringApplication.run (EmployeeApplication.class, args); // ...}}

Alternativt kan Spring også begynde at scanne fra den angivne pakke, som vi kan definere ved hjælp af basePackageClasses () eller basePackages (). Hvis der ikke er angivet nogen pakke, betragter den pakken for den klasse, der 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 medarbejderansøgning {} ugyldig hoved (String [] args) {ApplicationContext context = SpringApplication.run (EmployeeApplication.class, args); // ...}}

I eksemplet vil Spring scanne sundhedspleje og medarbejder pakker og Lærer klasse for komponenter.

Spring søger i de angivne pakker sammen med alle dets underpakker efter klasser, der er kommenteret med @Konfiguration. Derudover, det Konfiguration klasser kan indeholde @Bønne annoteringer, der registrerer metoderne som bønner i Spring-applikationskonteksten. Herefter er @ComponentScan annotation kan automatisk opdage sådanne bønner:

@Configuration public class Hospital {@Bean public Doctor getDoctor () {returner ny læge (); }}

Desuden er @ComponentScan annotation kan også scanne, registrere og registrere bønner til klasser, der er kommenteret med @Komponent, @Kontroller, @Serviceog @Repository.

For eksempel kan vi oprette en Medarbejder klasse som en komponent, der kan scannes af @ComponentScan kommentar:

@Component ("medarbejder") offentlig klassemedarbejder {// ...}

3.2. @EnableAutoConfiguration

Det @EnableAutoConfiguration annotation giver Spring Boot mulighed for automatisk at konfigurere applikationens kontekst. Derfor opretter og registrerer den automatisk bønner baseret på både de inkluderede jar-filer i klassestien og de bønner, der er defineret af os.

For eksempel når vi definerer spring-boot-starter-web afhængighed i vores klassesti, konfigurerer Spring Boot automatisk Tomcat og Spring MVC. Denne autokonfiguration har dog mindre forrang, hvis vi definerer vores egne konfigurationer.

Klassens pakke, der erklærer @EnableAutoConfiguration annotering betragtes som standard. Derfor bør vi altid anvende @EnableAutoConfiguration kommentar i rodpakken, så alle underpakker og klasser kan undersøges:

@Configuration @EnableAutoConfiguration offentlig klasse EmployeeApplication {public static void main (String [] args) {ApplicationContext context = SpringApplication.run (EmployeeApplication.class, args); // ...}}

Desuden er den @EnableAutoConfiguration annotation giver to parametre til manuelt at ekskludere enhver parameter:

Vi kan bruge udelukke for at deaktivere en liste over klasser, som vi ikke ønsker at blive konfigureret automatisk:

@Configuration @EnableAutoConfiguration (ekskluder = {JdbcTemplateAutoConfiguration.class}) offentlig klasse EmployeeApplication {public static void main (String [] args) {ApplicationContext context = SpringApplication.run (EmployeeApplication.class, args); // ...}}

Vi kan bruge excludeName for at definere en fuldt kvalificeret liste over klassenavne, som vi vil ekskludere fra den automatiske konfiguration:

@Configuration @EnableAutoConfiguration (excludeName = {"org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration"}) offentlig klasse EmployeeApplication {public static void main (String [] args) {ApplicationContext context = SpringApplication.run (EmployassApplication. arg.) ); // ...}}

Siden Spring Boot 1.2.0 kan vi bruge @SpringBootApplication kommentar, som er en kombination af de tre kommentarer @Configuration, @EnableAutoConfiguration, og@ComponentScan med deres standardattributter:

@SpringBootApplication offentlig klasse EmployeeApplication {public static void main (String [] args) {ApplicationContext context = SpringApplication.run (EmployeeApplication.class, args); // ...}}

4. Konklusion

I denne artikel lærte vi om forskellene mellem @ComponentScan og @EnableAutoConfiguration i Spring Boot.

Som altid er koden til disse eksempler tilgængelig på GitHub.