Spring Boot 4 wurde im 2025 veröffentlicht und baut auf Spring Framework 7. Es ist der Beginn einer neuen Generation – schlanker, typsicherer und produktionsreifer als je zuvor.
Dependency
xml
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>4.0.1</version></parent>
Mindest-Java-Version: 17. Empfohlen: Java 25.
1. HTTP Service Clients – kein Boilerplate mehr
Früher schrieb man für jeden externen REST-Aufruf manuell RestTemplate– oder WebClient-Code. Jetzt reicht ein annotiertes Interface – Spring generiert die Implementierung automatisch.
java
@HttpExchange(url = "https://dabbaghi.com")public interface UserClient { @GetExchange("/users/{id}") User findById(@PathVariable long id); @PostExchange("/users") User create(@RequestBody User user);}
Spring Boot registriert den Client automatisch als Bean, sobald ein RestClient.Builder oder WebClient.Builder im Kontext vorhanden ist. Kein manuelles Wrapping mehr.
2. API-Versionierung – eingebaut, ohne Aufwand
Versionierung von REST-APIs war bisher Handarbeit. Spring Boot 4 bringt native Unterstützung über application.yaml:
properties
spring: mvc: apiversion: default-version: 1 supported-versions: 1,2
Im Controller genügt eine Annotation:
java
@RestController@RequestMapping("/users")public class UserController { @GetMapping @ApiVersion(1) public List<User> listV1() { ... } @GetMapping @ApiVersion(2) public Page<User> listV2(Pageable pageable) { ... }}
Der Client gibt die gewünschte Version per Header (API-Version: 2) oder URL-Prefix (/v2/users) an – je nach Konfiguration.
3. Null-Sicherheit mit JSpecify
NullPointerException zur Laufzeit gehört der Vergangenheit an. Spring Boot 4 setzt auf JSpecify als Standard für Null-Annotationen. Das gesamte Spring-Framework ist damit annotiert.
java
import org.jspecify.annotations.NonNull;import org.jspecify.annotations.Nullable;@Servicepublic class GreetingService { public @NonNull String greet(@NonNull String name) { return "Hallo, " + name; } public @Nullable User findByEmail(@NonNull String email) { return userRepository.findByEmail(email).orElse(null); }}
Wer eigene Klassen absichern möchte, fügt die Abhängigkeit hinzu:
xml
<dependency> <groupId>org.jspecify</groupId> <artifactId>jspecify</artifactId> <version>1.0.0</version></dependency>
4. Modularisierung – kleinere JARs
Das frühere Monolith-JAR spring-boot-autoconfigure ist aufgeteilt. Jedes Modul enthält nur noch die Autokonfiguration, die es wirklich betrifft. Eine Anwendung, die nur JPA und Web nutzt, lädt keine LDAP- oder Neo4j-Konfiguration mehr mit. Das reduziert Speicherbedarf und Startzeit spürbar.
Es sind keine Code-Änderungen nötig – der Effekt tritt automatisch ein.
5. RestTestClient – saubere Integrationstests
Bisher bot Spring Boot MockMvc für Servlet-Tests und WebTestClient für reaktive Tests. Nun gibt es einen einheitlichen RestTestClient, der beide Welten abdeckt:
java
@SpringBootTest@AutoConfigureMockMvcclass UserControllerTest { @Autowired RestTestClient client; @Test void shouldReturnUser() { client.get().uri("/users/1") .exchange() .expectStatus().isOk() .expectBody(User.class) .value(user -> assertThat(user.id()).isEqualTo(1L)); }}
Derselbe Testcode funktioniert gegen MockMvc (kein Server) und gegen einen laufenden Server – nur die Annotation ändert sich.

Hinterlasse einen Kommentar