7 Auto-Konfiguration

Konventionen definieren Standardwerte. Auto-Konfiguration geht einen Schritt weiter: Sie erkennt, was du brauchst, und richtet es ein. Ohne dass du darum bittest.

7.1 Das Prinzip der bedingten Konfiguration

Spring Boot schaut beim Start in den Classpath – die Sammlung aller verfügbaren Bibliotheken. Basierend auf dem, was es dort findet, trifft es Entscheidungen.

Diese bedingte Logik nennt Spring Boot “Auto-Configuration”. Sie folgt einer einfachen Regel: Wenn eine Bibliothek da ist, wird sie vermutlich gebraucht. Also konfiguriere sie.

7.2 Was im Arcade-Projekt passiert

Die build.gradle.kts des Arcade-Projekts enthält diese Abhängigkeiten:

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.boot:spring-boot-starter-thymeleaf")
}

Zwei Zeilen. Aber was ziehen diese Starter nach sich?

Spring Boot sieht Tomcat im Classpath und startet einen eingebetteten Server. Es sieht Thymeleaf und registriert die Template-Engine. Es sieht Jackson und konfiguriert JSON-Serialisierung. Alles automatisch.

7.3 Die @Conditional-Familie

Unter der Haube arbeitet Spring Boot mit bedingten Annotationen. Die wichtigsten:

Annotation Bedeutung
@ConditionalOnClass Aktiviere, wenn diese Klasse im Classpath liegt
@ConditionalOnMissingClass Aktiviere, wenn diese Klasse fehlt
@ConditionalOnBean Aktiviere, wenn dieser Bean-Typ existiert
@ConditionalOnMissingBean Aktiviere, wenn dieser Bean-Typ fehlt
@ConditionalOnProperty Aktiviere, wenn diese Property gesetzt ist

Ein vereinfachtes Beispiel aus der Thymeleaf-Auto-Konfiguration:

@Configuration
@ConditionalOnClass(TemplateEngine.class)
@ConditionalOnMissingBean(TemplateEngine.class)
public class ThymeleafAutoConfiguration {
    
    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.setEnableSpringELCompiler(true);
        return engine;
    }
}

Die Logik: Wenn Thymeleaf im Classpath liegt (@ConditionalOnClass) und noch niemand manuell eine Template-Engine konfiguriert hat (@ConditionalOnMissingBean), dann erstelle eine mit sinnvollen Defaults.

7.4 Überschreiben statt Deaktivieren

Das @ConditionalOnMissingBean ist entscheidend. Es bedeutet: Die Auto-Konfiguration weicht zurück, sobald du selbst aktiv wirst.

Angenommen, du brauchst eine spezielle Jackson-Konfiguration. Du definierst einen eigenen ObjectMapper:

@Configuration
public class JacksonConfig {
    
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);
        mapper.setDateFormat(new SimpleDateFormat("dd.MM.yyyy"));
        return mapper;
    }
}

Spring Boot erkennt: Da ist bereits ein ObjectMapper. Die Auto-Konfiguration für Jackson greift nicht mehr. Deine Konfiguration gewinnt.

Das ist elegantes Design. Du musst nichts deaktivieren, keine Flags setzen, keine Exclusions definieren. Du stellst einfach bereit, was du brauchst – und Spring Boot tritt zurück.

7.5 Den Überblick behalten

Bei so viel Automatik kann man den Überblick verlieren. Was wurde eigentlich konfiguriert? Spring Boot bietet Hilfe.

Starte die Anwendung mit dem Debug-Flag:

./gradlew bootRun --args='--debug'

Die Konsole zeigt jetzt einen ausführlichen Report:

============================
CONDITIONS EVALUATION REPORT
============================

Positive matches:
-----------------
   ThymeleafAutoConfiguration matched:
      - @ConditionalOnClass found required class 'org.thymeleaf.spring6.SpringTemplateEngine'
      
   EmbeddedWebServerFactoryCustomizerAutoConfiguration matched:
      - @ConditionalOnWebApplication (required) found 'servlet' web application

Negative matches:
-----------------
   MongoAutoConfiguration:
      - @ConditionalOnClass did not find required class 'com.mongodb.client.MongoClient'

Positive Matches zeigen, was aktiviert wurde. Negative Matches zeigen, was nicht aktiviert wurde – und warum. Perfekt für Debugging.

7.6 Die Grenze der Magie

Auto-Konfiguration ist mächtig, aber nicht allwissend. Sie kann erkennen, dass MongoDB im Classpath liegt. Sie kann nicht erraten, auf welchem Server deine Datenbank läuft.

Deshalb gibt es eine klare Trennung:

Spring Boot nimmt dir Arbeit ab – aber nicht die Verantwortung. Die wichtigen Entscheidungen triffst immer noch du.