Die Spring-Boot-Welt
Zwölf Jahre "Convention over Configuration", ein Ökosystem aus hunderten Startern — und ein Auto-Configuration-Mechanismus, der bis heute wie stille Magie wirkt. Dieser Report macht sie sichtbar: live, klickbar, mit echten Zahlen aus einem produktiven Monorepo.
Von Boot 1.0 zu Boot 4.1
Jede Hauptversion hat einen Reibungspunkt aufgelöst — javax→jakarta, Reflection→AOT, Thread-Pool→Virtual Thread. Die Linie unten zeigt, wie die Abstraktionsebene stieg, ohne dass die darunterliegende Servlet-Welt je verschwand.
Die Autoconfiguration-Konstellation
spring-boot-autoconfigure bringt ~190 Konfigurationsklassen mit — alle liegen die ganze Zeit auf dem Classpath.
Aktiv wird nur, wessen @ConditionalOnClass/@ConditionalOnMissingBean-Bedingung zutrifft.
Klicke Starter an und beobachte, welche Klassen ihren Test bestehen und aufleuchten.
Sechs Säulen von Spring Boot 4
Deklarative HTTP-Clients (@HttpExchange) sind seit Boot 4 erste Wahl statt RestTemplate — getragen von RestClient und HttpServiceProxyFactory.
- Servlet-Stack (Tomcat/Jetty/Undertow) und Reactive-Stack (Netty/WebFlux) koexistieren weiter.
- ProblemDetail (RFC 7807) ist der Standard-Fehlerkörper.
- Virtual Threads laufen dem Servlet-Modell in die Karten: ein Thread pro Request, blockierender Code, aber ohne Plattform-Thread-Kosten.
@HttpExchange("/api/customers")
interface CustomerClient {
@GetExchange("/{id}")
Customer findById(@PathVariable Long id);
}
@Bean
CustomerClient customerClient(RestClient.Builder rcb) {
var adapter = RestClientAdapter.create(rcb.build());
var factory = HttpServiceProxyFactory
.builderFor(adapter).build();
return factory.createClient(CustomerClient.class);
}
Hibernate 7 bringt geänderte Naming-Strategien und ein strengeres @GeneratedValue(AUTO)-Verhalten mit — beides taucht typischerweise erst bei der Migration von Boot 3 auf.
- SpringPhysicalNamingStrategy ist umgezogen — Liquibase-referenceUrl muss den neuen FQN kennen.
- Virtual-Thread-taugliche TaskExecutor-Beans lösen klassische Thread-Pools für I/O-lastige Repositories ab.
- Spring Data JPA bleibt das Rückgrat — Query-Derivation und @Query unverändert kompatibel.
# application.properties
spring.threads.virtual.enabled=true
@Bean
AsyncTaskExecutor applicationTaskExecutor() {
return new VirtualThreadTaskExecutor("vt-");
}
Spring Security 7 räumt endgültig mit der WebSecurityConfigurerAdapter-Ära auf. Konfiguration läuft ausschließlich über die SecurityFilterChain-Bean mit Lambda-DSL.
- antMatchers()/mvcMatchers() → einheitlich requestMatchers().
- authorizeRequests() → authorizeHttpRequests().
- OAuth2-Resource-Server-Support bleibt Kernbestandteil, JWT-Validierung inklusive.
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(auth -> auth
.requestMatchers("/actuator/health").permitAll()
.anyRequest().authenticated())
.oauth2ResourceServer(oauth2 -> oauth2
.jwt(Customizer.withDefaults()));
return http.build();
}
Structured Logging (JSON/ECS/GELF) ist ab Boot 3.4 ohne Zusatzlibrary konfigurierbar — Boot 4 macht es zum empfohlenen Standard für jede containerisierte Anwendung.
- Micrometer + Micrometer Tracing bleiben die gemeinsame Basis für Metrics und verteiltes Tracing.
- /actuator/health unterstützt Gruppen und benutzerdefinierte Indikatoren nativ.
- Prometheus-Export ist ein Klick (Dependency) + ein Property entfernt.
logging.structured.format.console=ecs
management.endpoints.web.exposure.include=health,metrics,prometheus
management.tracing.sampling.probability=1.0
management.endpoint.health.show-details=when-authorized
GraalVM Native Images verwandeln den Boot-Vorgang von einer Sekunden- in eine Millisekunden-Angelegenheit — auf Kosten von Reflection, die durch AOT-Hints ersetzt werden muss.
Illustrative Größenordnungen aus öffentlichen GraalVM/Spring-Benchmarks — variieren stark nach App-Größe, Klassenzahl und Hardware.
./mvnw -Pnative spring-boot:build-image
docker run --rm -p 8080:8080 tina-application:4.1.0
# Cloud Native Buildpacks statt Dockerfile —
# seit Boot 2.3 im Boot-Plugin eingebaut.
Spring AI überträgt das Auto-Configuration-Prinzip auf LLM-Provider: ein Starter für OpenAI, Anthropic, Ollama oder Bedrock — ChatClient bleibt die Anwendungsseite identisch.
- ChatClient.Builder wird wie jeder andere Builder per Auto-Configuration bereitgestellt.
- Vector-Stores (pgvector, Redis, Chroma) sind austauschbare Beans — kein Vendor-Lock-in im Code.
- Prompt-Templates, Advisors (RAG, Memory) und Tool-Calling folgen demselben deklarativen Stil wie Spring Data Repositories.
@RestController
class AssistantController {
private final ChatClient chatClient;
AssistantController(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
@GetMapping("/ask")
String ask(@RequestParam String q) {
return chatClient.prompt().user(q).call().content();
}
}
Starter-Katalog
Ein Ausschnitt der wichtigsten Starter im Ökosystem — durchsuchbar, sortierbar.
| Starter | Zweck | Beispiel-Autoconfig-Klasse |
|---|---|---|
| spring-boot-starter-web | REST/MVC auf eingebettetem Tomcat | DispatcherServletAutoConfiguration |
| spring-boot-starter-webflux | Reaktive APIs auf Netty | ReactiveWebServerFactoryAutoConfiguration |
| spring-boot-starter-data-jpa | Relationale Persistenz via Hibernate | HibernateJpaAutoConfiguration |
| spring-boot-starter-data-mongodb | Dokumenten-Persistenz | MongoAutoConfiguration |
| spring-boot-starter-security | Auth & Zugriffskontrolle | SecurityAutoConfiguration |
| spring-boot-starter-actuator | Health, Metrics, Tracing | HealthEndpointAutoConfiguration |
| spring-boot-starter-validation | Bean Validation (Jakarta) | ValidationAutoConfiguration |
| spring-boot-starter-cache | Cache-Abstraktion | CacheAutoConfiguration |
| spring-boot-starter-batch | Batch-Jobs & Steps | BatchAutoConfiguration |
| spring-kafka | Event-Streaming | KafkaAutoConfiguration |
| spring-ai-starter-model-openai | LLM-Integration, ChatClient | OpenAiChatAutoConfiguration |
| spring-boot-starter-graphql | GraphQL-Endpunkte | GraphQlAutoConfiguration |
Migrations-Radar: Boot 3 → Boot 4
Kein Upgrade ohne Reibung. Die Einschätzung unten stammt aus einem realen Migrationsplan (Spring Boot 3.5.14 → 4.x, Java 17 → 21) — nicht aus der Theorie.
Warum Naming-Strategien beim Hibernate-Sprung stolpern
Ein echtes Monorepo: TINA
Kein Fantasie-Beispiel — Versionsstände 1:1 aus dem produktiven pom.xml eines Maven-Multi-Modul-Projekts, Stand 14.08.2026.
| Spring Boot | 4.1.0 |
| Java-Baseline | 21 |
| JUnit | 6.1.1 |
| AssertJ | 3.27.7 |
| Mockito | 5.23.0 |
| Liquibase | 4.33.0 |
| PostgreSQL-Treiber | 42.7.13 |
| H2 (Tests) | 2.4.240 |
| Lombok | 1.18.46 |
| MapStruct | 1.6.3 |
| Spring Boot Admin | 3.4.3 |
Spring Boot läuft hier bereits auf 4.1.0 — Spring Boot Admin dagegen noch auf 3.4.3. Kein Widerspruch, sondern exakt das Risiko aus dem Migrations-Radar oben: Monitoring-Add-ons ziehen bei Major-Releases oft erst mit Verzögerung nach. Der Build ist grün, weil Admin-Client und Boot-Version unabhängig versioniert sind — bis ein Boot-internes API sich ändert, das der Admin-Client noch anfasst.
Vier Maven-Module: Core (Business-Logik, REST, Persistenz), zwei Frontends (Legacy + Angular-Nachfolger "ng") und ein eigenes Integrationstest-Modul — getrennt von den Unit-Tests im Core.
Das Spring-Ökosystem
Spring Boot ist nur die Startrampe. Darüber liegt ein Baukasten aus Projekten, die dieselbe Auto-Configuration-Philosophie auf ihre jeweilige Domäne anwenden.
IoC-Container, AOP, Transaktionen — das Fundament, auf dem alles andere steht.
Ein Repository-Programmiermodell für JPA, MongoDB, Redis, Elasticsearch und mehr.
Auth, OAuth2/OIDC, Method-Security — Filterchain-basiert seit Version 7.
Config Server, Gateway, Circuit Breaker — Microservice-Muster als Dependency.
Jobs, Steps, Chunk-Verarbeitung für große, wiederholbare Datenläufe.
Enterprise-Integration-Patterns als Kanäle, Adapter und Gateways.
Modulare Monolithen mit klaren Grenzen — ohne den Sprung zu Microservices.
ChatClient, RAG, Vector-Stores — LLM-Provider austauschbar wie eine Datenbank.
Ein eigener OAuth2/OIDC-Provider, wenn Keycloak & Co. zu viel Overhead sind.
Schema-first GraphQL auf demselben Controller-Modell wie MVC.
Sessions extern speichern (Redis, JDBC) — stateless Instanzen, statefuler Nutzer.
Interaktive CLI-Anwendungen mit demselben Bean- und Auto-Config-Modell.