Spring Boot

Spring Boot 3 - Najważniejsze nowości i zmiany

10.10.2025
8 min

Poznaj kluczowe zmiany w Spring Boot 3, w tym wsparcie dla Java 17+, natywne obrazy GraalVM i nowe funkcje bezpieczeństwa.

Spring Boot 3 - Najważniejsze nowości i zmiany

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 przez jakarta.*

⚡ 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