Was ist der Unterschied zwischen @ComponentScan und @EnableAutoConfiguration im Spring Boot?


73

Was ist der Unterschied zwischen @ComponentScanund @EnableAutoConfigurationAnmerkungen in Spring Boot? Ist es notwendig, diese hinzuzufügen? Meine Anwendung funktioniert ohne diese Anmerkungen sehr gut. Ich möchte nur verstehen, warum wir sie hinzufügen müssen.


10
Haben Sie @SpringBootApplication? Das ist ein Ersatz für die beiden, die Sie erwähnt haben
Paul Samsotha

Ja, ich benutze sie in meiner Hauptklasse
e2rabi

8
@ComponentScan@EnableAutoConfigurationUm nach Ihren kommentierten Spring-Komponenten zu suchen, werden die kostenlosen Goodies (Konfigurationen, aktivierte Komponenten usw.) von Spring Boot aktiviert. @SprintBootApplicationMit dieser Option können Sie eine einzelne Anmerkung anstelle einiger häufig verwendeter Anmerkungen verwenden, wie die beiden von Ihnen genannten. Schauen Sie sich den
Javadoc

Antworten:


90

Was ist der Unterschied zwischen den Annotationen @ComponentScan und @EnableAutoConfiguration in Spring Boot?

@EnableAutoConfiguration Durch die Annotation wird Spring Boot angewiesen, anhand der von Ihnen hinzugefügten JAR-Abhängigkeiten zu "erraten", wie Sie Spring konfigurieren möchten. Wenn sich HSQLDB beispielsweise in Ihrem Klassenpfad befindet und Sie keine Datenbankverbindungs-Beans manuell konfiguriert haben, konfiguriert Spring automatisch eine speicherinterne Datenbank.

@ComponentScanWeist Spring an, nach anderen Komponenten, Konfigurationen und Diensten im angegebenen Paket zu suchen. Spring kann Ihre Beans oder Komponenten aus einem vordefinierten Projektpaket automatisch scannen, erkennen und registrieren. Wenn kein Paket angegeben ist, wird das aktuelle Klassenpaket als Stammpaket verwendet.

Ist es notwendig, diese hinzuzufügen?

Wenn Sie Spring Boot benötigen, um alles automatisch für Sie zu konfigurieren, @EnableAutoConfigurationist dies erforderlich. Sie müssen es nicht manuell hinzufügen. Spring fügt es basierend auf der von Ihnen bereitgestellten Anmerkung intern für Sie hinzu.

Tatsächlich ist die @SpringBootApplicationist Annotation entspricht der Verwendung @Configuration, @EnableAutoConfigurationund @ComponentScanmit ihren Standardattributen.

Siehe auch:


1
Und was ist mit zwischen @ComponentScan und @ComponentScans ?
Julio Villane

20

Einer der Hauptvorteile von Spring Boot ist die Annotation im Vergleich zu herkömmlichen XML-basierten Konfigurationen, @EnableAutoConfiguration Konfiguriert die Spring-Anwendung automatisch basierend auf den enthaltenen JAR-Dateien. Sie richtet Standardeinstellungen oder Hilfsprogramme basierend auf den Abhängigkeiten in pom.xml ein. Die automatische Konfiguration wird normalerweise basierend auf dem Klassenpfad und den definierten Beans angewendet. Daher müssen wir keine DataSource, EntityManagerFactory, TransactionManager usw. definieren. Auf magische Weise basierend auf dem Klassenpfad erstellt Spring Boot automatisch die richtigen Beans und registriert sie für uns. Wenn sich beispielsweise in Ihrem Klassenpfad eine tomcat-embedded.jar befindet, benötigen Sie wahrscheinlich eine TomcatEmbeddedServletContainerFactory (es sei denn, Sie haben Ihre eigene EmbeddedServletContainerFactory-Bean definiert). @EnableAutoConfiguration hat ein exclude-Attribut, um eine automatische Konfiguration explizit zu deaktivieren, andernfalls können wir sie einfach aus der pom.xml ausschließen.

@ComponentScan bietet Spielraum für das Scannen von Federkomponenten. Es durchläuft einfach das bereitgestellte Basispaket und greift die für @Bean oder @Autowired usw. erforderlichen Abhängigkeiten auf. In einer typischen Spring-Anwendung wird @ComponentScan in Konfigurationsklassen verwendet, die mit @ versehen sind Aufbau. Konfigurationsklassen enthalten mit @Bean annotierte Methoden. Diese mit @ Bean kommentierten Methoden generieren Beans, die vom Spring-Container verwaltet werden. Diese Beans werden durch die Annotation @ComponentScan automatisch erkannt. Es gibt einige Anmerkungen, die Beans automatisch erkennbar machen, z. B. @Repository, @Service, @Controller, @Configuration, @Component. Im folgenden Code beginnt Spring mit dem Scannen aus dem Paket einschließlich der BeanA-Klasse.

@Configuration
@ComponentScan(basePackageClasses = BeanA.class)
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
public class Config {

  @Bean
  public BeanA beanA(){
    return new BeanA();
  }

  @Bean
  public BeanB beanB{
    return new BeanB();
  }

}

4

@EnableAutoConfigurationIn Spring Boot gibt an, wie Sie Spring konfigurieren möchten, basierend auf den Jars, die Sie in Ihrem Klassenpfad hinzugefügt haben. Wenn Sie beispielsweise spring-boot-starter-webIhrem Klassenpfad Abhängigkeiten hinzufügen , werden Tomcat und Spring MVC automatisch konfiguriert.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Sie können @EnableAutoConfigurationAnnotation zusammen mit @ConfigurationAnnotation verwenden. Es hat zwei optionale Elemente,

  • ausschließen: Wenn Sie die automatische Konfiguration einer Klasse ausschließen möchten.
  • excludeName: Wenn Sie die automatische Konfiguration einer Klasse unter Verwendung des vollständig qualifizierten Klassennamens ausschließen möchten.

Beispiele:

@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
  public class MyConfiguration {
}


@EnableAutoConfiguration(excludeName = {"org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration"})
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@SpringBootApplicationist eine neuere Version, @EnableAutoConfigurationdie in Spring Boot 1.2 eingeführt wurde.

@SpringBootApplication ist eine Kombination aus drei Anmerkungen,

  • @Configuration - für Java-basierte Konfigurationsklassen.

  • @ComponentScan - Um das Scannen von Komponenten zu aktivieren, werden alle Pakete und Unterpakete automatisch gescannt, die sich unter dem Stammpaket befinden, auf das @SpringBootApplication angewendet wird.

  • @EnableAutoConfiguration- um die automatische Konfiguration der
    Klassen zu aktivieren, basiert auf den im Klassenpfad hinzugefügten Gläsern.

@ComponentScanAktiviert das Scannen von Komponenten, sodass Webcontroller-Klassen und andere von Ihnen erstellte Komponenten im Anwendungskontext von Spring automatisch erkannt und als Beans registriert werden. Sie können die Basispakete angeben, die zur automatischen Erkennung und Registrierung von Beans gescannt werden.

Eines der optionalen Elemente ist:

  • basePackages - kann verwendet werden, um bestimmte zu scannende Pakete anzugeben.

Beispiel,

@ComponentScan(basePackages = {"com.example.test"})
@Configuration
public class SpringConfiguration { }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.