14 July 2026
3 min readSpring Boot 4.0 ra mắt tháng 11/2025 với nhiều cải tiến lớn: Modular Auto-configuration, API Versioning, JSpecify Null Safety, Declarative HTTP Clients, và Observability nâng cao. Hướng dẫn chi tiết từng tính năng mới.

Spring Boot 4.0 chính thức ra mắt vào ngày 20/11/2025, đánh dấu một bước tiến lớn trong hệ sinh thái Spring. Phiên bản này được xây dựng trên Spring Framework 7 và Jakarta EE 11, mang đến nhiều cải tiến quan trọng giúp ứng dụng nhẹ hơn, an toàn hơn và dễ bảo trì hơn.
Trong Spring Boot 3, file spring-boot-autoconfigure.jar chứa tất cả cấu hình cho mọi thứ (LDAP, Neo4j, Quartz...) dù bạn có dùng hay không. Điều này làm ứng dụng nặng và tốn bộ nhớ.
Spring Boot 4 tách nhỏ thành các module riêng biệt. Bạn chỉ load những gì thực sự cần.
| Spring Boot 3 | Spring Boot 4 |
|---|---|
| 1 JAR lớn chứa tất cả | Nhiều module nhỏ |
| Load toàn bộ config | Chỉ load config cần thiết |
| Tốn bộ nhớ | Tiết kiệm bộ nhớ |
Đây là tính năng được developer mong chờ nhất! Giờ đây API versioning được tích hợp sẵn trong core.
1// Phải tự xử lý version trong URL hoặc header
2@GetMapping("/api/v1/users")
3public List<User> getUsersV1() { }
4
5@GetMapping("/api/v2/users")
6public List<User> getUsersV2() { }1@RestController
2@RequestMapping("/api/users")
3public class UserController {
4
5 @GetMapping(version = "1.0")
6 public List<UserV1> getUsersV1() {
7 return userService.findAllV1();
8 }
9
10 @GetMapping(version = "2.0")
11 public List<UserV2> getUsersV2() {
12 return userService.findAllV2();
13 }
14}1@Configuration
2public class ApiVersionConfig {
3
4 @Bean
5 public ApiVersionConfigurer apiVersionConfigurer() {
6 return ApiVersionConfigurer.builder()
7 .versionFormat("\\d+\\.\\d+") // Format: 1.0, 2.0
8 .pathPrefix("/api/v{version}") // URL: /api/v1.0/users
9 .build();
10 }
11}/api/v1/usersX-API-Version: 1.0/api/users?version=1.0Spring Boot 4 áp dụng JSpecify làm chuẩn cho null safety, thay thế các annotation cũ như @Nullable của Spring.
1// Maven
2<dependency>
3 <groupId>org.jspecify</groupId>
4 <artifactId>jspecify</artifactId>
5 <version>1.0.0</version>
6</dependency>1// package-info.java
2@NullMarked
3package com.example.service;
4
5import org.jspecify.annotations.NullMarked;1// Mọi thứ mặc định là Non-Null
2// Chỉ đánh dấu @Nullable cho exception
3public class UserService {
4
5 public User findById(Long id) {
6 // Phải return non-null, IDE sẽ cảnh báo nếu return null
7 return userRepository.findById(id)
8 .orElseThrow(() -> new ResourceNotFoundException("User not found"));
9 }
10
11 @Nullable
12 public User findByEmail(String email) {
13 // Có thể return null
14 return userRepository.findByEmail(email).orElse(null);
15 }
16}Gọi API bên ngoài giờ đây cực kỳ đơn giản, không cần thêm thư viện như Feign.
1// RestTemplate - verbose và khó đọc
2ResponseEntity<User> response = restTemplate.exchange(
3 "https://api.example.com/users/1",
4 HttpMethod.GET,
5 null,
6 User.class
7);
8
9// Hoặc phải dùng Spring Cloud Feign - thêm dependency nặng1public interface UserClient {
2
3 @GetExchange("/users/{id}")
4 User getUser(@PathVariable Long id);
5
6 @GetExchange("/users")
7 List<User> getAllUsers();
8
9 @PostExchange("/users")
10 User createUser(@RequestBody CreateUserRequest request);
11}1@Configuration
2public class HttpClientConfig {
3
4 @Bean
5 public UserClient userClient() {
6 RestClient restClient = RestClient.builder()
7 .baseUrl("https://api.example.com")
8 .build();
9
10 return HttpServiceProxyFactory
11 .builderFor(RestClientAdapter.create(restClient))
12 .build()
13 .createClient(UserClient.class);
14 }
15}1@Service
2public class MyService {
3
4 private final UserClient userClient;
5
6 public User getExternalUser(Long id) {
7 return userClient.getUser(id);
8 }
9}Spring Boot 4 tích hợp Micrometer 2.0 và Actuator 4 với nhiều cải tiến.
1# application.properties
2spring.ssl.bundle.jks.server.keystore.location=classpath:server.p12
3spring.ssl.bundle.jks.server.keystore.password=secret
4
5# Actuator sẽ tự động monitor SSL certificate
6management.endpoints.web.exposure.include=health,info
7management.endpoint.health.show-details=always/actuator/health1{
2 "status": "UP",
3 "components": {
4 "ssl": {
5 "status": "UP",
6 "details": {
7 "server": {
8 "expiresIn": "45 days",
9 "validFrom": "2025-01-01",
10 "validUntil": "2026-01-01"
11 }
12 }
13 }
14 }
15}@Observed annotation1@Service
2public class PaymentService {
3
4 @Observed(name = "payment.process", contextualName = "process-payment")
5 public PaymentResult processPayment(PaymentRequest request) {
6 // Method này sẽ tự động được track:
7 // - Thời gian thực thi
8 // - Số lần gọi
9 // - Số lần lỗi
10 return doProcess(request);
11 }
12}Cách đăng ký bean linh hoạt hơn với BeanRegistrar.
1public class CustomBeanRegistrar implements BeanRegistrar {
2
3 @Override
4 public void register(BeanRegistry registry, Environment env) {
5 registry.registerBean("primaryService", PrimaryService.class);
6
7 registry.registerBean("fallbackService", FallbackService.class, spec -> {
8 spec.fallback();
9 spec.order(1);
10 });
11 }
12}| Tính năng | Mô tả | Lợi ích |
|---|---|---|
| Modular Auto-config | Tách nhỏ auto-configuration | Giảm memory, khởi động nhanh |
| API Versioning | Hỗ trợ native trong core | Code sạch, dễ maintain |
| JSpecify Null Safety | Chuẩn null safety mới | IDE warning, ít bug NullPointer |
| HTTP Interface | Declarative HTTP client | Không cần Feign, code đơn giản |
| Observability | Micrometer 2.0, SSL monitoring | Monitor tốt hơn, ít downtime |
| Kotlin 2.2 | Baseline mới cho Kotlin | Tương thích tốt, DSL mạnh mẽ |
Spring Boot 4 không chỉ là một bản nâng cấp, mà là sự thay đổi tư duy trong việc xây dựng ứng dụng Java hiện đại.