Ulaşım
- Adres:Batıkent Mh. 8910 Sk. 6. Etap 1H No: 18 Yeni Toki Eyyübiye / Şanlıurfa (Yeni Alım Satım Karşısı)
- Telefon:0 (545) 528 88 93
- eMail: info@alestaweb.com
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.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.
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:
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;
}
}
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.
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.
# 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
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);
}
}
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.
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 |
# 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
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.
Spring Boot 4'ün Java sürüm gereksinimleri şöyle şekilleniyor:
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ı.
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.
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.
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);
}
}
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.
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.
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);
}
}
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.
# 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
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-opentelemetry</artifactId>
</dependency>
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:
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.
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.
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 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();
}
}
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 |
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.
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.
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.
<!-- 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>
<properties>
<java.version>21</java.version>
</properties>
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.
# 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
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.
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.
<!-- 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>
# 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:
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.
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.
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()
);
}
}
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.
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:
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.