Unterschied zwischen @ComponentScan und @EnableAutoConfiguration im Spring Boot

1. Einleitung

In diesem kurzen Tutorial lernen wir die Unterschiede zwischen den Annotationen @ComponentScan und @EnableAutoConfiguration im Spring Framework kennen.

2. Frühlingsanmerkungen

Anmerkungen erleichtern die Konfiguration der Abhängigkeitsinjektion im Frühjahr. Anstatt XML-Konfigurationsdateien zu verwenden, können wir Spring Bean-Annotationen für Klassen und Methoden verwenden, um Beans zu definieren . Danach konfiguriert und verwaltet der Spring IoC-Container die Beans.

Hier ist eine Übersicht über die Anmerkungen, die wir in diesem Artikel diskutieren werden:

  • @ComponentScan sucht nach kommentierten Spring-Komponenten
  • @EnableAutoConfiguration wird verwendet, um die automatische Konfiguration zu aktivieren

Lassen Sie uns nun den Unterschied zwischen diesen beiden Anmerkungen untersuchen.

3. Wie sie sich unterscheiden

Der Hauptunterschied zwischen diesen Anmerkungen besteht darin, dass @ComponentScan nach Spring-Komponenten sucht, während @EnableAutoConfiguration zum automatischen Konfigurieren von Beans verwendet wird, die im Klassenpfad in Spring Boot-Anwendungen vorhanden sind .

Lassen Sie uns sie nun genauer durchgehen.

3.1. @ComponentScan

Während der Entwicklung einer Anwendung müssen wir das Spring-Framework anweisen, nach von Spring verwalteten Komponenten zu suchen. Mit @ComponentScan kann Spring nach Konfigurationen, Controllern, Diensten und anderen von uns definierten Komponenten suchen .

Insbesondere der @ComponentScanDie Annotation wird mit der Annotation @Configuration verwendet , um das Paket anzugeben, das Spring nach Komponenten durchsuchen soll :

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

Alternativ kann Spring auch mit dem Scannen ab dem angegebenen Paket beginnen, das wir mit basePackageClasses () oder basePackages () definieren können . Wenn kein Paket angegeben ist, wird das Paket der Klasse betrachtet, das die Annotation @ComponentScan als Startpaket deklariert :

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); // ... } }

In diesem Beispiel durchsucht Spring die Pakete für das Gesundheitswesen und die Mitarbeiter sowie die Lehrerklasse nach Komponenten.

Spring durchsucht die angegebenen Pakete zusammen mit allen Unterpaketen nach Klassen, die mit @Configuration versehen sind . Darüber hinaus können die Konfigurationsklassen @ Bean- Annotationen enthalten , die die Methoden als Beans im Spring-Anwendungskontext registrieren . Danach kann die Annotation @ ComponentScan solche Beans automatisch erkennen:

@Configuration public class Hospital { @Bean public Doctor getDoctor() { return new Doctor(); } }

Darüber hinaus kann die Annotation @ ComponentScan auch Beans für Klassen scannen, erkennen und registrieren, die mit @Component, @Controller, @Service und @Repository annotiert sind .

Beispielsweise können wir eine Employee- Klasse als Komponente erstellen, die mit der Annotation @ ComponentScan gescannt werden kann :

@Component("employee") public class Employee { // ... }

3.2. @EnableAutoConfiguration

Mit der Annotation @EnableAutoConfiguration kann Spring Boot den Anwendungskontext automatisch konfigurieren . Daher werden automatisch Beans erstellt und registriert, die sowohl auf den im Klassenpfad enthaltenen JAR-Dateien als auch auf den von uns definierten Beans basieren.

Wenn wir beispielsweise die Spring-Boot-Starter-Web- Abhängigkeit in unserem Klassenpfad definieren, konfiguriert Spring Boot Tomcat und Spring MVC automatisch. Diese automatische Konfiguration hat jedoch weniger Vorrang, wenn wir unsere eigenen Konfigurationen definieren.

Das Paket der Klasse, die die Annotation @EnableAutoConfiguration deklariert, wird als Standard betrachtet . Daher sollten wir immer die Annotation @EnableAutoConfiguration im Stammpaket anwenden , damit alle Unterpakete und Klassen untersucht werden können:

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

Darüber hinaus enthält die Annotation @EnableAutoConfiguration zwei Parameter, mit denen Parameter manuell ausgeschlossen werden können:

Wir können exclude verwenden , um eine Liste von Klassen zu deaktivieren, die nicht automatisch konfiguriert werden sollen:

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

Wir können excludeName verwenden , um eine vollständig qualifizierte Liste von Klassennamen zu definieren, die wir von der automatischen Konfiguration ausschließen möchten:

@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); // ... } }

Seit dem Frühjahr Boot - 1.2.0 können wir die Verwendung @SpringBootApplication Anmerkung, die eine Kombination der drei Anmerkungen @Configuration, @EnableAutoConfiguration, und @ComponentScan mit ihren Standardattributen :

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

4. Fazit

In diesem Artikel haben wir die Unterschiede zwischen @ComponentScan und @EnableAutoConfiguration in Spring Boot kennengelernt .

Wie immer ist der Code für diese Beispiele auf GitHub verfügbar.