Spring Boot 3 - Najważniejsze nowości i zmiany
Poznaj kluczowe zmiany w Spring Boot 3, w tym wsparcie dla Java 17+, natywne obrazy GraalVM i nowe funkcje bezpieczeństwa.

Spring Boot 3 wprowadza rewolucyjne zmiany, które fundamentalnie wpływają na sposób tworzenia aplikacji w ekosystemie Spring. Ta najnowsza wersja przynosi nie tylko znaczące ulepszenia wydajności, ale także nowoczesne podejście do rozwoju aplikacji Java.
🚀 Najważniejsze zmiany w Spring Boot 3
Wymagania systemowe
Spring Boot 3 wprowadza podwyższone wymagania co do wersji języka Java:
- Minimalna wersja Java: Java 17 (LTS)
- Wsparcie dla: Java 17, 18, 19, 20, 21+
- Koniec wsparcia: Java 8, 11
# Sprawdzenie wersji Java
java -version
# Wymagane: openjdk version "17.0.x" lub wyższy
🔧 Migracja na Jakarta EE
Jedna z najbardziej znaczących zmian to przejście z Java EE na Jakarta EE:
// ❌ Spring Boot 2.x (Java EE)
import javax.servlet.http.HttpServletRequest;
import javax.persistence.Entity;
import javax.validation.constraints.NotNull;
// ✅ Spring Boot 3.x (Jakarta EE)
import jakarta.servlet.http.HttpServletRequest;
import jakarta.persistence.Entity;
import jakarta.validation.constraints.NotNull;
💡 Ważne: Wszystkie importy
javax.*muszą zostać zastąpione przezjakarta.*
⚡ GraalVM Native Images
Spring Boot 3 wprowadza pierwszy poziom wsparcia dla GraalVM Native Images:
Korzyści natywnych obrazów:
- 🚀 Szybki start - aplikacja uruchamia się w milisekundach
- 💾 Mniejsze zużycie pamięci - o 50-80% mniej RAM
- 📦 Mniejszy rozmiar - samodzielne executable
- ⚡ Natychmiastowa wydajność - brak JIT warm-up
Tworzenie natywnego obrazu:
# Dodaj do pom.xml
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
</plugin>
# Budowanie natywnego obrazu
./mvnw -Pnative native:compile
# Uruchomienie (start < 100ms!)
./target/my-app
Przykład porównania czasów startowych:
| Typ aplikacji | Czas startu | Zużycie RAM |
|---|---|---|
| JVM | ~3-5 sekund | ~200-400MB |
| Native | ~50-100ms | ~50-100MB |
🛡️ Ulepszenia bezpieczeństwa
HTTP/3 Support
# application.yml
server:
http2:
enabled: true
compression:
enabled: true
Improved SSL Configuration
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
return http
.requiresChannel(channel ->
channel.requestMatchers(r -> r.getHeader("X-Forwarded-Proto") != null)
.requiresSecure())
.headers(headers -> headers
.httpStrictTransportSecurity(hstsConfig -> hstsConfig
.maxAgeInSeconds(31536000)
.includeSubdomains(true)))
.build();
}
}
📊 Observability i Monitoring
Spring Boot 3 wprowadza znaczące ulepszenia w obszarze monitorowania:
Micrometer Tracing
// Automatyczne śledzenie requestów
@RestController
public class UserController {
@GetMapping("/users/{id}")
@NewSpan("get-user") // Automatyczne spanowanie
public User getUser(@PathVariable Long id) {
// Spring automatycznie dodaje trace ID
return userService.findById(id);
}
}
Native Metrics
# application.yml
management:
endpoints:
web:
exposure:
include: health,metrics,prometheus
metrics:
distribution:
percentiles-histogram:
http.server.requests: true
🎯 Nowe funkcje developera
Problem Details (RFC 7807)
@RestController
public class ApiController {
@ExceptionHandler(UserNotFoundException.class)
public ProblemDetail handleUserNotFound(UserNotFoundException ex) {
ProblemDetail problemDetail = ProblemDetail.forStatusAndDetail(
HttpStatus.NOT_FOUND,
ex.getMessage()
);
problemDetail.setTitle("User Not Found");
problemDetail.setProperty("userId", ex.getUserId());
return problemDetail;
}
}
Odpowiedź JSON:
{
"type": "about:blank",
"title": "User Not Found",
"status": 404,
"detail": "User with ID 123 not found",
"userId": 123
}
@HttpExchange - Deklaratywne HTTP Clients
@HttpExchange("https://api.example.com")
public interface UserApiClient {
@GetExchange("/users/{id}")
User getUser(@PathVariable Long id);
@PostExchange("/users")
User createUser(@RequestBody CreateUserRequest request);
@DeleteExchange("/users/{id}")
void deleteUser(@PathVariable Long id);
}
// Konfiguracja
@Configuration
public class ClientConfig {
@Bean
public UserApiClient userApiClient() {
WebClient webClient = WebClient.builder()
.baseUrl("https://api.example.com")
.build();
HttpServiceProxyFactory factory = HttpServiceProxyFactory
.builder(WebClientAdapter.forClient(webClient))
.build();
return factory.createClient(UserApiClient.class);
}
}
🔄 Przewodnik migracji
1. Aktualizacja zależności
<!-- pom.xml -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.5</version>
</parent>
<properties>
<java.version>17</java.version>
</properties>
2. Automatyczna migracja importów
# Użyj OpenRewrite do automatycznej migracji
./mvnw org.openrewrite.maven:rewrite-maven-plugin:run \
-Drewrite.recipeArtifactCoordinates=org.openrewrite.recipe:rewrite-spring:LATEST \
-Drewrite.activeRecipes=org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_0
3. Kluczowe zmiany w konfiguracji
# Spring Boot 2.x
spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: https://auth.example.com
# Spring Boot 3.x (bez zmian w tym przypadku)
spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: https://auth.example.com
⚠️ Znane problemy i rozwiązania
1. Problemy z refleksją w Native Images
// Dodaj konfigurację refleksji
@RegisterReflectionForBinding({User.class, Order.class})
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
2. Problemy z bibliotekami trzecimi
Niektóre biblioteki mogą wymagać dodatkowej konfiguracji:
// META-INF/native-image/reflect-config.json
[
{
"name": "com.example.MyClass",
"allDeclaredConstructors": true,
"allDeclaredMethods": true
}
]
📈 Wydajność - Benchmarki
Porównanie Spring Boot 2.7 vs 3.1
| Metryka | Spring Boot 2.7 | Spring Boot 3.1 | Poprawa |
|---|---|---|---|
| Czas startu (JVM) | 4.2s | 3.1s | 26% szybciej |
| Zużycie pamięci | 280MB | 220MB | 21% mniej |
| Throughput | 15k req/s | 18k req/s | 20% więcej |
| GC pause | 45ms | 28ms | 38% krócej |
🎉 Podsumowanie
Spring Boot 3 to znaczący krok naprzód w ekosystemie Spring, oferujący:
- ✅ Nowoczesne wymagania - Java 17+
- ✅ Rewolucyjną wydajność - GraalVM Native Images
- ✅ Lepsze bezpieczeństwo - Jakarta EE
- ✅ Zaawansowany monitoring - Micrometer Tracing
Czy warto migrować?
TAK, jeśli:
- Twoja aplikacja używa Java 17+
- Potrzebujesz lepszej wydajności
- Chcesz wykorzystać natywne obrazy
- Planujesz długoterminowy rozwój
Poczekaj, jeśli:
- Jesteś nadal na Java 8/11
- Używasz wielu legacy bibliotek
- Aplikacja jest w fazie stabilizacji
Gotowy na migrację? Sprawdź nasze konsultacje Spring Boot i usługi migracyjne 👉 Kontakt