🌱 spring-boot-welt
JAVA 21 · SPRING FRAMEWORK 7 · SEIT 2014

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.

Spring Boot 4.1 Spring Framework 7 Hibernate 7 Spring Security 7 Virtual Threads GraalVM Native Spring AI
0
Jahre am Markt
seit März 2014
4.1
Aktuelle Version
auf Spring Framework 7
0
Java-Baseline
LTS, Virtual Threads inklusive
0
Auto-Config-Klassen
≈, Core-Modul autoconfigure
ZEITLEISTE

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.

LIVE-DEMONSTRATION

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.

Aktivierte Klassen: 0 / 0
Bedingung erfüllt (aktiv) auf Classpath, inaktiv
DEEP-DIVE

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.
Deklarativer HTTP-Client
@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.
Virtual Threads aktivieren
# 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.
SecurityFilterChain (Boot 4 / Security 7)
@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.
application.properties
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.

Native Image bauen & starten
./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.
Spring AI ChatClient
@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();
    }
}
NACHSCHLAGEN

Starter-Katalog

Ein Ausschnitt der wichtigsten Starter im Ökosystem — durchsuchbar, sortierbar.

StarterZweckBeispiel-Autoconfig-Klasse
spring-boot-starter-webREST/MVC auf eingebettetem TomcatDispatcherServletAutoConfiguration
spring-boot-starter-webfluxReaktive APIs auf NettyReactiveWebServerFactoryAutoConfiguration
spring-boot-starter-data-jpaRelationale Persistenz via HibernateHibernateJpaAutoConfiguration
spring-boot-starter-data-mongodbDokumenten-PersistenzMongoAutoConfiguration
spring-boot-starter-securityAuth & ZugriffskontrolleSecurityAutoConfiguration
spring-boot-starter-actuatorHealth, Metrics, TracingHealthEndpointAutoConfiguration
spring-boot-starter-validationBean Validation (Jakarta)ValidationAutoConfiguration
spring-boot-starter-cacheCache-AbstraktionCacheAutoConfiguration
spring-boot-starter-batchBatch-Jobs & StepsBatchAutoConfiguration
spring-kafkaEvent-StreamingKafkaAutoConfiguration
spring-ai-starter-model-openaiLLM-Integration, ChatClientOpenAiChatAutoConfiguration
spring-boot-starter-graphqlGraphQL-EndpunkteGraphQlAutoConfiguration
RISIKO-ANALYSE

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.

RISIKO · HOCH
Verschlüsselungs-Library von Drittanbietern ohne offizielle Boot-4-Kompatibilität — Alternative: natives spring.config.decrypt oder Vault-Integration.
RISIKO · MITTEL
Admin-/Monitoring-Konsolen von Drittanbietern hinken Major-Releases oft hinterher — Versionsstand vor dem Upgrade prüfen, nicht danach.
Warum Naming-Strategien beim Hibernate-Sprung stolpern
Physical- und Implicit-Naming-Strategien wandern zwischen Spring-Boot- und Hibernate-eigenen Paketen. Liquibase-referenceUrl-Parameter, die den alten FQN hart verdrahtet haben, brechen erst beim Vergleichslauf — nicht beim Kompilieren. Ein klassischer "grüner Build, roter Diff".
FELDBERICHT

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 Boot4.1.0
Java-Baseline21
JUnit6.1.1
AssertJ3.27.7
Mockito5.23.0
Liquibase4.33.0
PostgreSQL-Treiber42.7.13
H2 (Tests)2.4.240
Lombok1.18.46
MapStruct1.6.3
Spring Boot Admin3.4.3
BEOBACHTUNG

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.

MODULE

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.

ÜBERBLICK

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.

🧵
Spring Framework 7

IoC-Container, AOP, Transaktionen — das Fundament, auf dem alles andere steht.

🗄️
Spring Data

Ein Repository-Programmiermodell für JPA, MongoDB, Redis, Elasticsearch und mehr.

🔐
Spring Security

Auth, OAuth2/OIDC, Method-Security — Filterchain-basiert seit Version 7.

☁️
Spring Cloud

Config Server, Gateway, Circuit Breaker — Microservice-Muster als Dependency.

📦
Spring Batch

Jobs, Steps, Chunk-Verarbeitung für große, wiederholbare Datenläufe.

🔗
Spring Integration

Enterprise-Integration-Patterns als Kanäle, Adapter und Gateways.

🧩
Spring Modulith

Modulare Monolithen mit klaren Grenzen — ohne den Sprung zu Microservices.

🤖
Spring AI

ChatClient, RAG, Vector-Stores — LLM-Provider austauschbar wie eine Datenbank.

🛡️
Spring Authorization Server

Ein eigener OAuth2/OIDC-Provider, wenn Keycloak & Co. zu viel Overhead sind.

🕸️
Spring for GraphQL

Schema-first GraphQL auf demselben Controller-Modell wie MVC.

💾
Spring Session

Sessions extern speichern (Redis, JDBC) — stateless Instanzen, statefuler Nutzer.

🖥️
Spring Shell

Interaktive CLI-Anwendungen mit demselben Bean- und Auto-Config-Modell.