11 Spring Boot Autoconfiguration

11.1 Einführung

Die automatische Konfiguration (Autoconfiguration) ist eines der Kernfeatures von Spring Boot, das es Entwicklern ermöglicht, Anwendungen mit minimaler manueller Konfiguration zu erstellen. Sie reduziert den Aufwand, der normalerweise für die Einrichtung von Frameworks und Bibliotheken erforderlich ist, indem sie intelligente Annahmen über die benötigten Einstellungen trifft und diese automatisch konfiguriert.

11.2 Motivation und Hintergrund

In traditionellen Spring-Anwendungen mussten Entwickler oft umfangreiche XML-Dateien oder Java-basierte Konfigurationen schreiben, um verschiedene Komponenten wie Datenbanken, Webserver oder Sicherheitsmodule einzurichten. Dies führte zu einem erhöhten Aufwand und potenziellen Fehlerquellen. Spring Boot adressiert dieses Problem durch die Einführung der automatischen Konfiguration, die auf dem Prinzip Konvention vor Konfiguration basiert.

11.3 Funktionsweise der Autoconfiguration

Die automatische Konfiguration in Spring Boot basiert auf mehreren Mechanismen:

  1. Konditionale Beans

    Spring Boot verwendet Annotationen wie @ConditionalOnClass, @ConditionalOnMissingBean und @ConditionalOnProperty, um zu bestimmen, ob bestimmte Beans erstellt werden sollen.

  2. Starter-Abhängigkeiten

    Durch die Verwendung von Starter-Paketen wie spring-boot-starter-web oder spring-boot-starter-data-jpa werden die notwendigen Abhängigkeiten eingebunden, die die automatische Konfiguration auslösen.

  3. SpringFactoriesLoader

    Die Autokonfigurationsklassen werden über den META-INF/spring.factories-Eintrag geladen, der in den JAR-Dateien der Starter-Pakete definiert ist.

11.4 Ablauf der automatischen Konfiguration

flowchart TD
    A[Start der Anwendung] --> B{Vorhandene Abhängigkeiten analysieren}
    B --> C{Passende Autokonfigurationen identifizieren}
    C --> D{Konditionale Beans prüfen}
    D -- Bedingungen erfüllt --> E[Beans erstellen]
    D -- Bedingungen nicht erfüllt --> F[Beans nicht erstellen]

11.4.1 Beispiel: Automatische Konfiguration eines Datenquellen-Pools

Wenn sich HikariCP (ein JDBC-Connection-Pool) und ein JDBC-Treiber im Klassenpfad befinden, wird Spring Boot automatisch einen DataSource-Bean konfigurieren.

11.4.2 Codebeispiel:

Ohne zusätzliche Konfiguration können Sie in Ihrer Anwendung auf die Datenquelle zugreifen:

@Service
public class UserService {

    private final JdbcTemplate jdbcTemplate;

    public UserService(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    // Methoden, die die Datenbank nutzen
}

11.4.3 Erläuterung:

11.5 Anpassung der Autokonfiguration

Obwohl die automatische Konfiguration viele sinnvolle Standardwerte bereitstellt, gibt es Fälle, in denen Anpassungen erforderlich sind.

11.5.1 Beispiel: Ändern der Datenbankverbindung

In der application.properties oder application.yml können Sie die Datenbankeinstellungen konfigurieren:

spring.datasource.url=jdbc:mysql://localhost:3306/meine_datenbank
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

11.6 Deaktivieren spezifischer Autokonfigurationen

Falls bestimmte Autokonfigurationen nicht gewünscht sind, können diese deaktiviert werden.

11.6.1 Beispiel: Deaktivieren der Sicherheitsautokonfiguration

@SpringBootApplication(exclude = { SecurityAutoConfiguration.class })
public class MyApplication {
    // ...
}

11.6.2 Autokonfigurationsberichte

Um zu verstehen, welche Konfigurationen angewendet wurden, können Sie den Autokonfigurationsbericht nutzen.

11.6.3 Aktivieren des Debug-Modus

Fügen Sie debug=true in der application.properties hinzu oder starten Sie die Anwendung mit dem Flag --debug.

11.6.3.1 Beispielausgabe

Negative matches:
-----------------
...

Positive matches:
-----------------
...

Exclusions:
-----------
...

11.7 Erstellen eigener Autokonfigurationen

Sie können benutzerdefinierte Autokonfigurationen erstellen, um eigene Starter-Pakete oder Bibliotheken zu unterstützen.

11.7.1 Schritt 1: Erstellen einer Autokonfigurationsklasse

@Configuration
@ConditionalOnClass(MyLibrary.class)
public class MyLibraryAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public MyLibrary myLibrary() {
        return new MyLibrary();
    }
}

11.7.2 Schritt 2: Registrieren in spring.factories

Erstellen Sie die Datei META-INF/spring.factories mit folgendem Inhalt:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.MyLibraryAutoConfiguration

11.7.3 Best Practices für die Verwendung der Autokonfiguration

  1. Verstehen der Standardkonfigurationen

    Machen Sie sich mit den Standardwerten vertraut, um unvorhergesehene Verhalten zu vermeiden.

  2. Gezieltes Überschreiben von Einstellungen

    Überschreiben Sie nur die Einstellungen, die für Ihre Anwendung relevant sind.

  3. Vermeiden von redundanten Bean-Definitionen

    Definieren Sie keine Beans manuell, die bereits durch die Autokonfiguration bereitgestellt werden, es sei denn, Sie möchten das Standardverhalten ändern.

11.8 Häufige Autokonfigurationen in Spring Boot

11.9 Vorteile der Autokonfiguration

11.10 Mögliche Fallstricke

11.11 Debugging der Autokonfiguration

Wenn Probleme auftreten, können Sie den ConditionEvaluationReport verwenden, um zu sehen, welche Bedingungen für Beans erfüllt oder nicht erfüllt wurden.

11.11.1 Beispiel: Anzeigen des Berichts

@RestController
public class ConditionEvaluationReportController {

    @Autowired
    private ConditionEvaluationReport report;

    @GetMapping("/autoconfig")
    public ConditionEvaluationReport getReport() {
        return report;
    }
}

11.12 Hinweis

Für den Zugriff auf den ConditionEvaluationReport müssen Sie die Abhängigkeit spring-boot-actuator hinzufügen und die entsprechende Endpoint-Sicherheit konfigurieren.

11.13 tl;dr

Die automatische Konfiguration in Spring Boot reduziert den Konfigurationsaufwand, indem sie intelligente Annahmen trifft und basierend auf dem Klassenpfad und vorhandenen Beans Einstellungen automatisch vornimmt. Dies ermöglicht eine schnellere Entwicklung und konsistente Konfiguration, während dennoch Flexibilität für Anpassungen und Erweiterungen besteht.