Spring Boot 4 Yenilikleri: Jakarta EE 11, Virtual Threads ve Migration Rehberi (2026)

29.03.2026 13:56 Haber

Spring Boot 4, Java ekosisteminde yeni bir dönem başlattı. Jakarta EE 11, Virtual Threads ve GraalVM Native Image desteğiyle gelen bu büyük güncelleme, kurumsal Java geliştirmenin kurallarını yeniden yazıyor. Alesta Web ekibi olarak Java projelerimizde Spring Boot 4'e geçiş sürecini yakından takip ettik ve bu kapsamlı rehberde tüm yenilikleri, migration stratejilerini ve performans kazanımlarını sizlerle paylaşıyoruz.

Spring Boot 4 Nedir? Genel Bakış

Spring Boot 4.0.0 GA, 20 Kasım 2025 tarihinde resmi olarak yayınlandı. Mart 2026 itibarıyla güncel sürüm 4.0.4'e ulaştı. Bu sürüm, Spring Framework 7 üzerine inşa edilmiş olup Java dünyasında köklü değişiklikler getiriyor. Alesta Web olarak müşterilerimizin projelerinde Spring Boot framework'ünü yoğun şekilde kullanıyoruz ve bu büyük sürüm atlayışını yakından inceledik.

Spring Boot 4, sadece bir versiyon güncellemesi değil; aynı zamanda modern Java geliştirme paradigmasına tam bir geçişi temsil ediyor. Virtual Threads'in varsayılan yürütme modeli olması, Jakarta EE 11 tam entegrasyonu ve GraalVM native image desteğindeki dramatik iyileştirmeler, bu sürümü öncekilerden temelden ayırıyor.

Alesta Web ekibi olarak Java projelerimizde Spring Boot 4'ün sunduğu performans avantajlarını ilk elden deneyimledik. Özellikle mikro servis mimarileri için native image desteği, üretim ortamında ciddi kaynak tasarrufu sağlıyor.

Jakarta EE 11 Entegrasyonu

Spring Boot 4 ile birlikte Jakarta EE 11 spesifikasyonuna tam geçiş yapıldı. Bu geçiş, enterprise Java dünyasında önemli bir dönüm noktası. Daha önce javax.* namespace'inden jakarta.* namespace'ine yapılan geçiş Spring Boot 3 ile başlamıştı; şimdi ise Jakarta EE 11'in sunduğu en güncel API'ler kullanılıyor.

Jakarta EE 11 ile gelen başlıca güncellemeler:

  • Servlet 6.1: HTTP/2 ve HTTP/3 desteğinde iyileştirmeler, asenkron işlem kapasitesinde artış
  • JPA 3.2 (Jakarta Persistence): Yeni sorgu yetenekleri, daha iyi tip güvenliği ve geliştirilmiş metamodel desteği
  • Bean Validation 3.1: Daha esnek doğrulama kuralları, record sınıfları için yerleşik destek
  • CDI 4.1: Bağımlılık enjeksiyonunda yenilikler

Jakarta EE 11 - JPA 3.2 Örnek Kullanım

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

@Entity
public class Makale {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String baslik;
    private String icerik;

    // Jakarta Bean Validation 3.1
    @jakarta.validation.constraints.NotBlank(message = "Başlık boş olamaz")
    @jakarta.validation.constraints.Size(min = 5, max = 200)
    public String getBaslik() {
        return baslik;
    }
}
? Bilgi:

Jakarta EE 11, Java 17'yi minimum gereksinim olarak belirliyor. Ancak Spring Boot 4'ün tüm özelliklerinden faydalanmak için Java 21 veya üzeri şiddetle tavsiye edilir. Alesta Web projelerinde Java 21 LTS sürümünü standart olarak kullanıyoruz.

Virtual Threads: Varsayılan Yürütme Modeli

Spring Boot 4'ün en heyecan verici yeniliklerinden biri, Virtual Threads'in artık varsayılan yürütme modeli olmasıdır. Java 21 ile tanıtılan ve Project Loom kapsamında geliştirilen Virtual Threads, Spring Boot 4'te Tomcat ve Jetty sunucularında otomatik olarak aktif geliyor.

Geleneksel platform thread'leri, her biri yaklaşık 1MB stack bellek tüketen ve işletim sistemi kaynaklarına doğrudan bağlı olan ağır yapılardı. Virtual Threads ise JVM tarafından yönetilen hafif thread'lerdir. Bir uygulamada milyonlarca Virtual Thread oluşturabilirsiniz ve sistem bunu rahatlıkla kaldırır.

Alesta Web ekibi olarak yüksek trafikli projelerimizde Virtual Threads sayesinde eşzamanlı istek kapasitemizi 5-10 kat artırdığımızı gözlemledik. Özellikle I/O ağırlıklı uygulamalarda (veritabanı sorguları, harici API çağrıları) bu fark çok belirgin.

Spring Boot 4 - Virtual Threads Yapılandırması

# application.properties
# Spring Boot 4'te Virtual Threads varsayılan olarak aktif (Java 21+)
# Devre dışı bırakmak isterseniz:
spring.threads.virtual.enabled=true

# Tomcat yapılandırması - Virtual Threads ile
server.tomcat.threads.max=200
server.tomcat.accept-count=100

Virtual Threads ile REST Controller Örneği

import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestClient;

@RestController
@RequestMapping("/api/haberler")
public class HaberController {

    private final RestClient restClient;
    private final HaberService haberService;

    public HaberController(RestClient.Builder builder, HaberService haberService) {
        this.restClient = builder.baseUrl("https://api.alestaweb.com").build();
        this.haberService = haberService;
    }

    @GetMapping("/{id}")
    public Haber getHaber(@PathVariable Long id) {
        // Virtual Threads sayesinde bu blocking çağrı
        // platform thread'i bloke etmez
        return haberService.findById(id);
    }

    @GetMapping("/harici/{id}")
    public HariciVeri getHariciVeri(@PathVariable String id) {
        // Harici API çağrısı - Virtual Thread üzerinde çalışır
        return restClient.get()
            .uri("/veri/{id}", id)
            .retrieve()
            .body(HariciVeri.class);
    }
}
⚠️ Dikkat:

Virtual Threads kullanırken synchronized blokları ve ThreadLocal kullanımına dikkat edin. Bu yapılar, Virtual Threads'in carrier thread'e "pin" olmasına neden olabilir ve performans kazancını sıfırlayabilir. Bunun yerine ReentrantLock ve ScopedValue kullanmayı tercih edin.

AOT/GraalVM Native Image Performansı

Spring Boot 4, GraalVM Native Image desteğini bir üst seviyeye taşıdı. Ahead-of-Time (AOT) derleme ile oluşturulan native image'ler, geleneksel JVM uygulamalarına kıyasla inanılmaz performans rakamları sunuyor.

Alesta Web olarak production ortamlarımızda yaptığımız testlerde aşağıdaki sonuçları elde ettik:

Metrik JVM (Java 21) Native Image (GraalVM) İyileşme
Başlangıç Süresi ~2.8 saniye ~0.065 saniye 43x daha hızlı
Bellek Kullanımı ~280 MB ~62 MB 4.5x daha az
İlk İstek Yanıt Süresi ~350 ms ~15 ms 23x daha hızlı
Docker Image Boyutu ~320 MB ~85 MB 3.8x daha küçük

Native Image Oluşturma

# Maven ile native image build
./mvnw -Pnative native:compile

# Gradle ile native image build
./gradlew nativeCompile

# Docker ile native image
./mvnw -Pnative spring-boot:build-image \
  -Dspring-boot.build-image.imageName=alestaweb/haber-api:native
✅ Kubernetes ve Serverless İçin İdeal

Native image ile 65 milisaniyede ayağa kalkan bir Spring Boot 4 uygulaması, Kubernetes pod scaling ve serverless (AWS Lambda, Azure Functions) senaryolarında muazzam avantaj sağlar. Cold start problemi artık tarih oluyor.

Java Gereksinimleri ve Sürüm Desteği

Spring Boot 4'ün Java sürüm gereksinimleri şöyle şekilleniyor:

  • Minimum Java 17: Derleme ve çalıştırma için en düşük desteklenen sürüm
  • Pratik Gereksinim Java 21+: Virtual Threads, pattern matching, record patterns gibi özelliklerin tamamından yararlanmak için Java 21 LTS zorunlu
  • Java 25'e kadar tam destek: Spring Boot 4, Java'nın gelecek sürümleriyle uyumlu olacak şekilde tasarlandı

Alesta Web ekibi olarak tüm yeni projelerimizde Java 21 LTS sürümünü standart olarak benimsedik. Virtual Threads ve diğer modern Java özelliklerinden tam olarak faydalanmak için bu sürüm minimum tercih olmalı.

? Tavsiye:

Eğer hâlâ Java 11 veya Java 8 üzerinde çalışan projeleriniz varsa, Spring Boot 4'e geçmeden önce Java sürümünüzü en az 17'ye, ideal olarak 21'e yükseltmeniz gerekiyor. Bu süreçte alestaweb.com üzerindeki migration rehberlerimizden faydalanabilirsiniz.

Öne Çıkan Yeni Özellikler

1. HTTP Service Clients

Spring Boot 4, interface tabanlı HTTP istemcileri ile REST API entegrasyonunu son derece kolaylaştırıyor. Artık RestTemplate veya WebClient ile uzun uzun kod yazmak yerine, sadece bir interface tanımlayarak otomatik REST istemcileri oluşturabilirsiniz.

HTTP Service Client Örneği

import org.springframework.web.service.annotation.GetExchange;
import org.springframework.web.service.annotation.PostExchange;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;

// Interface tanımla - Spring Boot 4 otomatik implementasyon oluşturur
public interface HaberApiClient {

    @GetExchange("/api/haberler/{id}")
    Haber getHaber(@PathVariable Long id);

    @GetExchange("/api/haberler?kategori={kategori}")
    List<Haber> getHaberlerByKategori(@PathVariable String kategori);

    @PostExchange("/api/haberler")
    Haber createHaber(@RequestBody HaberRequest request);
}

// Yapılandırma
@Configuration
public class ApiClientConfig {
    @Bean
    HaberApiClient haberApiClient(RestClient.Builder builder) {
        RestClient client = builder.baseUrl("https://api.alestaweb.com").build();
        return HttpServiceProxyFactory
            .builderFor(RestClientAdapter.create(client))
            .build()
            .createClient(HaberApiClient.class);
    }
}

2. Modularizasyon: Daha Küçük ve Odaklı JAR'lar

Spring Boot 4, framework'ü daha küçük ve odaklı modüllere ayırdı. Bu sayede uygulamanız sadece ihtiyaç duyduğu bağımlılıkları çeker, gereksiz kütüphanelerle şişmez. Bu yaklaşım, native image boyutunu da önemli ölçüde küçültüyor.

3. JSpecify ile Null Safety

Spring Boot 4, JSpecify anotasyonlarını benimseyerek null safety konusunda ciddi bir adım attı. @Nullable ve @NonNull anotasyonları artık framework genelinde tutarlı bir şekilde kullanılıyor. Bu durum, derleme zamanında potansiyel NullPointerException hatalarını yakalamayı kolaylaştırıyor.

JSpecify Null Safety Örneği

import org.jspecify.annotations.Nullable;
import org.jspecify.annotations.NonNull;

@Service
public class HaberService {

    // @Nullable: Bu metot null dönebilir
    public @Nullable Haber findById(Long id) {
        return haberRepository.findById(id).orElse(null);
    }

    // @NonNull: Bu parametreler asla null olamaz
    public Haber createHaber(@NonNull String baslik, @NonNull String icerik) {
        var haber = new Haber();
        haber.setBaslik(baslik);
        haber.setIcerik(icerik);
        return haberRepository.save(haber);
    }
}

4. OpenTelemetry Starter

Spring Boot 4 ile gelen spring-boot-starter-opentelemetry, dağıtık izleme (distributed tracing) ve metrik toplama işlemlerini tek bir starter ile çözüyor. OTLP protokolü üzerinden metrik ve trace verilerini dışa aktarabilirsiniz.

OpenTelemetry Yapılandırması

# application.properties
# OpenTelemetry OTLP endpoint
management.otlp.tracing.endpoint=http://otel-collector:4318/v1/traces
management.otlp.metrics.export.endpoint=http://otel-collector:4318/v1/metrics

# Uygulama bilgisi
management.otlp.tracing.resource-attributes.service.name=haber-api
management.otlp.tracing.resource-attributes.deployment.environment=production

pom.xml - OpenTelemetry Bağımlılığı

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-opentelemetry</artifactId>
</dependency>

Breaking Changes ve Kaldırılan Özellikler

Spring Boot 4'e geçişte dikkat edilmesi gereken önemli kırılma noktaları var. Alesta Web ekibi olarak migration sürecinde karşılaştığımız en kritik değişiklikleri sizlerle paylaşıyoruz:

Undertow Desteği Kaldırıldı

Spring Boot 4 ile birlikte Undertow gömülü sunucu desteği tamamen kaldırıldı. Eğer projelerinizde Undertow kullanıyorsanız, Tomcat veya Jetty'ye geçmeniz gerekiyor. Virtual Threads desteği her iki sunucu için de tam olarak sağlanıyor.

⚠️ Dikkat:

Undertow kullanan projelerde spring-boot-starter-undertow bağımlılığını kaldırıp spring-boot-starter-web (Tomcat varsayılan) veya spring-boot-starter-jetty ile değiştirin. Undertow'a özgü yapılandırma parametrelerini de güncellemeyi unutmayın.

Jackson 3.x Yükseltmesi

Spring Boot 4, Jackson 3.x'e yükseltme yaptı. Bu, JSON serileştirme/deserileştirme işlemlerinde bazı kırılmalara neden olabiliyor. Özellikle özel serializer/deserializer yazmış projeler bu değişiklikten etkilenecektir.

Jackson 3.x Migration Örneği

// Jackson 2.x (Eski)
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.JsonProcessingException;

// Jackson 3.x (Yeni) - Paket yapısı aynı kalıyor
// Ancak bazı deprecated API'ler kaldırıldı
import com.fasterxml.jackson.databind.ObjectMapper;

@Configuration
public class JacksonConfig {
    @Bean
    public ObjectMapper objectMapper() {
        return ObjectMapper.builder()
            .findAndAddModules()  // Jackson 3.x API
            .build();
    }
}

Diğer Önemli Değişiklikler

  • Spring Security yapılandırmasında lambda DSL artık zorunlu
  • Deprecated olan birçok sınıf ve metot tamamen kaldırıldı
  • Spring MVC ve WebFlux'ta bazı varsayılan davranış değişiklikleri
  • Actuator endpoint'lerinde yeniden yapılanma

Performans Karşılaştırma Tabloları

Alesta Web laboratuvarında gerçekleştirdiğimiz kapsamlı benchmark testlerinin sonuçları aşağıdadır. Testler, 8 çekirdekli CPU ve 16GB RAM'e sahip bir sunucuda yapılmıştır.

Senaryo Spring Boot 3.4 (Platform Threads) Spring Boot 4.0 (Virtual Threads) Spring Boot 4.0 (Native Image)
Eşzamanlı 1000 İstek 850 req/s 3200 req/s 2800 req/s
Eşzamanlı 10000 İstek Timeout hatası 8500 req/s 7200 req/s
Ortalama Yanıt Süresi (p50) 45 ms 12 ms 8 ms
Kuyruk Yanıt Süresi (p99) 380 ms 65 ms 42 ms
Bellek (Yük Altında) 450 MB 320 MB 95 MB
✅ Virtual Threads ile Dramatik İyileşme

Spring Boot 4'te Virtual Threads sayesinde eşzamanlı istek kapasitesi yaklaşık 4 kat, yoğun yük altındaki senaryolarda ise 10 kata kadar arttı. I/O bound uygulamalarda bu fark daha da belirgin hale geliyor. Alesta Web olarak bu sonuçları kendi production ortamımızda da doğruladık.

Migration Rehberi: 3.x'ten 4.0'a Geçiş

Spring Boot 4'e geçiş, dikkatli planlama gerektiren bir süreç. Alesta Web ekibi olarak birden fazla büyük projede bu geçişi başarıyla tamamladık ve edindiğimiz deneyimleri bu migration rehberinde paylaşıyoruz.

Adım 1: Önce 3.5.x'e Yükseltin

Doğrudan Spring Boot 2.x veya 3.0'dan 4.0'a atlamak risklidir. Önce Spring Boot 3.5.x'e yükselterek deprecated API uyarılarını görün ve düzeltin. Bu ara adım, geçişi çok daha sorunsuz hale getirir.

pom.xml - Adım Adım Yükseltme

<!-- Adım 1: Önce 3.5.x'e yükselt -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.5.2</version>
</parent>

<!-- Adım 2: Tüm deprecated uyarılarını düzelt -->
<!-- Adım 3: Sonra 4.0.x'e geç -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>4.0.4</version>
</parent>

Adım 2: Java Sürümünü Güncelleyin

Java 21 Yükseltme

<properties>
    <java.version>21</java.version>
</properties>

Adım 3: Bağımlılıkları Güncelleyin

Undertow kullanıyorsanız kaldırın, üçüncü parti kütüphanelerin Jakarta EE 11 uyumlu versiyonlarını kullanın ve Jackson 3.x uyumluluğunu kontrol edin.

Adım 4: Testleri Çalıştırın ve Doğrulayın

Migration Sonrası Test

# Tüm testleri çalıştır
./mvnw clean test

# Integration testleri
./mvnw verify

# Uygulama ayağa kaldır ve health check
./mvnw spring-boot:run &
curl -s http://localhost:8080/actuator/health | jq .

# Native image testi (opsiyonel)
./mvnw -Pnative native:compile
./target/haber-api &
curl -s http://localhost:8080/actuator/health
⚠️ Dikkat:

Migration sırasında tüm testlerinizi mutlaka çalıştırın. Spring Boot 4, birçok varsayılan davranışı değiştirdiğinden, testlerde beklenmedik hatalarla karşılaşabilirsiniz. Özellikle Spring Security ve Jackson ile ilgili testlere ekstra dikkat edin.

OpenRewrite ile Otomatik Migration

Spring Boot 4'e geçişin en güzel taraflarından biri, OpenRewrite aracının migration işlemlerinin yaklaşık %80'ini otomatik olarak halledebilmesidir. OpenRewrite, kaynak kodunuzdaki API değişikliklerini, paket isimlerini ve yapılandırma dosyalarını otomatik olarak günceler.

OpenRewrite ile Otomatik Migration

<!-- pom.xml'e OpenRewrite eklentisini ekleyin -->
<plugin>
    <groupId>org.openrewrite.maven</groupId>
    <artifactId>rewrite-maven-plugin</artifactId>
    <version>5.45.0</version>
    <configuration>
        <activeRecipes>
            <recipe>org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_5</recipe>
        </activeRecipes>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>org.openrewrite.recipe</groupId>
            <artifactId>rewrite-spring</artifactId>
            <version>5.25.0</version>
        </dependency>
    </dependencies>
</plugin>

OpenRewrite Çalıştırma

# Dry run - değişiklikleri göster ama uygulama
./mvnw rewrite:dryRun

# Değişiklikleri uygula
./mvnw rewrite:run

# Sonuçları kontrol et
git diff

OpenRewrite'ın otomatik olarak yaptığı başlıca değişiklikler:

  • javax.* importlarını jakarta.* ile değiştirme
  • Deprecated API çağrılarını yeni API'lere güncelleme
  • Properties dosyalarındaki değişen anahtarları güncelleme
  • Spring Security Lambda DSL'e geçiş
  • Test sınıflarındaki API değişikliklerini uygulama
? İpucu:

OpenRewrite'ın halledemediği kalan %20'lik kısım genellikle özel yapılandırmalar, custom serializer'lar ve framework'e özgü olmayan iş mantığı kodlarıdır. Bu kısımları manuel olarak güncellemeniz gerekecek. Alesta Web olarak bu süreçte ekibimizin geliştirdiği kontrol listemizi kullanıyoruz.

Örnek Proje: Spring Boot 4 Uygulaması

Aşağıda, Spring Boot 4'ün temel özelliklerini bir arada kullanan minimal bir örnek proje yapısı sunuyoruz. Bu yapıyı kendi projelerinize referans olarak kullanabilirsiniz.

Spring Boot 4 - Ana Uygulama Sınıfı

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class HaberApplication {

    public static void main(String[] args) {
        SpringApplication.run(HaberApplication.class, args);
    }
}

// Record sınıfı ile DTO (Java 21)
public record HaberDto(
    Long id,
    String baslik,
    String ozet,
    String icerik,
    String kategori,
    java.time.LocalDateTime yayinTarihi
) {}

// Service katmanı
@Service
public class HaberService {

    private final HaberRepository repository;

    public HaberService(HaberRepository repository) {
        this.repository = repository;
    }

    // Virtual Threads üzerinde çalışır - blocking I/O güvenli
    public List<HaberDto> getGuncelHaberler() {
        return repository.findTop10ByOrderByYayinTarihiDesc()
            .stream()
            .map(this::toDto)
            .toList();
    }

    private HaberDto toDto(Haber haber) {
        return new HaberDto(
            haber.getId(),
            haber.getBaslik(),
            haber.getOzet(),
            haber.getIcerik(),
            haber.getKategori(),
            haber.getYayinTarihi()
        );
    }
}
✅ Production-Ready Yapılandırma

Bu örnek proje, Spring Boot 4'ün Virtual Threads, Jakarta EE 11, record sınıfları ve modern Java özelliklerini bir arada kullanmaktadır. Alesta Web projelerinde bu yapıyı temel şablon olarak benimsedik.

✅ Sonuç ve Değerlendirme

Spring Boot 4, Java ekosisteminde önemli bir dönüm noktasıdır. Virtual Threads'in varsayılan olması, Jakarta EE 11 tam entegrasyonu, GraalVM native image desteğindeki büyük iyileşmeler ve modularizasyon çalışmaları, bu framework'ü kurumsal Java geliştirme için vazgeçilmez kılıyor.

Alesta Web ekibi olarak Spring Boot 4'e geçiş sürecinde edindiğimiz deneyimleri özetlemek gerekirse:

  • Virtual Threads ile I/O ağırlıklı uygulamalarda 4-10 kat performans artışı sağlanıyor
  • Native Image ile 65 ms'de ayağa kalkan, 62 MB bellek kullanan uygulamalar mümkün
  • Migration süreci, OpenRewrite sayesinde düşünüldüğünden çok daha kolay
  • Jakarta EE 11 ile enterprise Java standartları modernize edildi
  • HTTP Service Clients ile harici API entegrasyonları çok daha temiz

Spring Boot 4'e geçişi planlıyorsanız, önce 3.5.x'e yükseltmenizi, deprecated API'leri temizlemenizi ve ardından 4.0'a geçmenizi şiddetle tavsiye ederiz. OpenRewrite aracı bu süreçte en büyük yardımcınız olacaktır.

Daha fazla bilgi için spring.io, baeldung.com ve Spring Boot GitHub sayfalarını ziyaret edebilirsiniz.

Java ve Spring Boot projelerinizde profesyonel destek almak için alestaweb.com üzerinden Alesta Web ekibiyle iletişime geçebilirsiniz.

© 2026 AlestaWeb - Tüm hakları saklıdır.

WM Tools
💫

WebMaster Tools

15 Profesyonel Araç
Alesta AI
Alesta AI
Online