Konventionen definieren Standardwerte. Auto-Konfiguration geht einen Schritt weiter: Sie erkennt, was du brauchst, und richtet es ein. Ohne dass du darum bittest.
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.
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.
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.
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.
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.
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.