JDK 28 ‘Value Classes’ Uyumluluk Uyarısı (30 Çekirdek Sınıf Dönüşümü), Spring Security 7.2.0-RC1 (CSP Nonce) ve Spring AI MCP Arayüzleri

JDK 28 ‘Value Classes’ Uyumluluk Uyarısı (30 Çekirdek Sınıf Dönüşümü), Spring Security 7.2.0-RC1 (CSP Nonce) ve Spring AI MCP Arayüzleri
Java ekosisteminde Project Valhalla (JEP 401: Value Classes and Objects) artık teorik bir dil tasarım tartışması olmaktan çıkıp mevcut açık kaynak kütüphanelerin ikili (binary) ve çalışma zamanı uyumluluğunu doğrudan etkileyen somut bir aşamaya geçti. 27 Ekim 2026'da Inside.java üzerinde Oracle Java Developer Advocate Nicolai Parlog tarafından yayımlanan "Quality Outreach Heads-up — JDK 28: Value Classes" bildirisi, JDK 28 erken erişim derlemelerinde --enable-preview bayrağı etkinleştirildiğinde 30 standart JDK sınıfının doğrudan kimliksiz değer sınıfına (value class) dönüştüğünü duyurdu. Aynı gün Josh Long tarafından paylaşılan This Week in Spring (27 Ekim 2026) bülteninde ise Spring Security 7.2.0-RC1 (ContentSecurityPolicyNonceGeneratingFilter), Spring Data 2026.0.2 ve Spring AI MCP Apps mimarileri tanıtıldı.
1. OpenJDK Quality Outreach Uyarısı: JDK 28’de 30 Çekirdek Sınıf Neden Davranış Değiştiriyor?
Normal şartlarda yeni bir Java dil özelliği önizleme (preview) aşamasında sunulduğunda, mevcut kütüphaneler yeni sözdizimini (value class) açıkça kullanmadığı sürece eski kodların davranışı değişmez. Ancak JEP 401 bu kuralın nadir bir istisnasıdır: JDK 28'de --enable-preview bayrağı açıldığı anda, mevcut kod tabanları tek bir satır bile değiştirilmemiş olsa dahi JDK standart kütüphanesindeki 30 temel sınıf çalışma zamanında kimliksiz Value Class olarak yüklenmektedir.
1.1. Value Class’a Dönüşen Başlıca JDK Sınıfları (ve String İstisnası)
Önizleme modunda nesne kimliğini (object identity) kaybederek düzleştirilmiş bellek düzenine (flattened memory layout) geçen 30 sınıf arasında şunlar yer almaktadır:
- 8 İlkel Sarmalayıcı Sınıfın Tamamı:
java.lang.Integer,Long,Double,Float,Byte,Short,CharacterveBoolean(ayrıca üst sınıfjava.lang.Number). - Dil ve Çekirdek Soyutlamalar:
java.lang.Recordvejava.util.Optional(OptionalInt,OptionalLong,OptionalDoubledahil). - Tarih ve Zaman API'si (
java.time):LocalDate,LocalTime,LocalDateTime,OffsetDateTime,ZonedDateTime,Instant,Duration,Period,Year,YearMonthvb.
Neden
java.lang.StringDahil Edilmedi? OpenJDK mühendisleriStringsınıfını da değer sınıfına dönüştürmeyi değerlendirmiş; ancak mevcut kurumsal ve açık kaynak Java kodlarındasynchronized(someString)veyaStringreferans kimliğine dayalı çok fazla eski (legacy) kullanım bulunması nedeniyleStringsınıfını kimlikli (identity) sınıf olarak bırakmıştır.
flowchart TD
A["JDK 28 Erken Erişim Derlemesi\n(CI/CD Test Hattı)"] --> B{"--enable-preview\nAktif mi?"}
B -->|"Hayır (Varsayılan Mod)"| C["Standart Kimlikli (Identity) Sınıflar\nJVM Regresyon Doğrulaması"]
B -->|"Evet (Valhalla Önizleme Modu)"| D["30 Çekirdek JDK Sınıfı Value Class Olur\n(Integer, Long, Optional, LocalDate, Record vb.)"]
D --> E["1. Kimlik Duyarlı İşlemler:\nsynchronized(Integer) & WeakReference -> IdentityException"]
D --> F["2. Referans Eşitliği (==):\nBellek Adresi Yerine Alan (State) Değerlerini Karşılaştırır"]
D --> G["3. Record Kurucuları (JEP 539):\nAlanlar super() Çağrısından Önce Başlatılır"]
style B fill:#7c2d12,stroke:#f97316,color:#ffffff
style C fill:#1e293b,stroke:#38bdf8,color:#ffffff
style D fill:#064e3b,stroke:#10b981,color:#ffffff
style E fill:#7f1d1d,stroke:#ef4444,color:#ffffff
1.2. Kütüphane Geliştiricilerinin Karşılaşacağı 3 Uyumluluk Kategorisi
Nicolai Parlog, açık kaynak (FOSS) proje yöneticilerinin CI/CD hatlarında karşılaşabileceği kırılmaları üç kategoride toplamaktadır:
- Kimlik Kaybından Kaynaklanan Beklenen Farklar (
IdentityExceptionve==): Değer sınıflarının benzersiz bir yığın (heap) adresi veya monitör kilidi yoktur. Bu nedenlesynchronized (Integer.valueOf(42))veyanew WeakReference<>(Optional.of("test"))çalıştıran eski kütüphaneler çalışma zamanındaIdentityExceptionhatasıyla karşılaşacaktır. Ayrıca ikiLocalDateveyaIntegerörneği üzerinde yapılan==karşılaştırması artık bellek adresini değil, içerdikleri alan değerlerini (state) karşılaştırmaktadır (-128..127 önbellek sınırının ötesindekiInteger.valueOf(1000) == Integer.valueOf(1000)ifadesitruedöner). RecordKurucularındaki (Constructors) Yapısal Değişiklikler:java.lang.Recordsınıfının değer sınıflarıyla uyumlu hale getirilmesi ve JEP 539 (Strict Field Initialization) kuralları nedeniyle, kayıt (record) kurucularında alanlarınsuper()çağrısından önce başlatılması (early initialization) davranışı devreye girmektedir; bayt kodu (bytecode) manipülasyonu yapan kütüphanelerin (ASM, ByteBuddy, Hibernate, Jackson) bu yeni kurucu dizilimini tanıması gerekir.- Beklenmeyen JDK Hataları: OpenJDK Kalite Grubu, kütüphane geliştiricilerini projelerini hem önizleme kapalıyken hem de
--enable-previewaçıkken test etmeye ve olası JVM çökmelerinivalhalla-devlistesine bildirmeye çağırmaktadır.
2. This Week in Spring (27 Ekim 2026): Spring Security 7.2.0-RC1 ve Sürüm Dalgası
Josh Long tarafından yayımlanan 27 Ekim 2026 bülteni, Spring Boot 4.x ve Jakarta EE 11 temelinde yükselen kapsamlı bir sürüm dalgasını duyurdu:
- Spring Security
7.2.0-RC1(ve7.1.2/7.0.8): Sürümün en önemli güvenlik yeniliği,ContentSecurityPolicyNonceGeneratingFiltersınıfıyla gelen yerleşik Nonce tabanlı İçerik Güvenliği Politikası (CSP) desteğidir. XSS (Cross-Site Scripting) saldırılarını önlemek için'unsafe-inline'kullanmak yerine, filtre her HTTP isteğinde kriptografik birnoncedeğeri üretmekte ve bunu hemContent-Security-Policybaşlığına hem de Thymeleaf şablonlarındaki<script>/<style>etiketlerine otomatik olarak işlemekte; ayrıca WebAuthn (Passkeys) kayıt ekranı özelleştirmelerini kolaylaştırmaktadır. - Spring Data, Session ve LDAP Güncellemeleri: Spring Data
2026.0.2ve2025.1.8kararlı sürümleriyle birlikte Spring Session4.2.0-RC1ve Spring LDAP4.2.0-RC1/4.1.2/4.0.6yayınlandı. - Spring AI ile Etkileşimli MCP Uygulamaları (MCP Apps) ve Hızlı RAG: Craig Walls tarafından yayınlanan iki yeni mimari rehber; Model Context Protocol (MCP) sunucularının
CopilotKit/AG-UIentegrasyonuyla yalnızca ham JSON/metin değil, doğrudan etkileşimli kullanıcı arayüzü bileşenleri (Rendering Rich UIs with MCP Apps) döndürmesini ve ONNX Transformers yerel gömülüm modelleriyle RAG boru hatlarındaki vektörleştirme gecikmesinin radikal biçimde düşürülmesini detaylandırdı.
| Bileşen / Duyuru | Sürüm / Hedef | Temel Teknik Özellik | Mimari Etki |
|---|---|---|---|
| OpenJDK Quality Outreach | JDK 28 (JEP 401) |
--enable-preview ile 30 çekirdek JDK sınıfının (Integer, Optional, LocalDate, Record) Value Class olması |
synchronized / WeakReference üzerinde IdentityException ve == semantik değişimi |
| Spring Security | 7.2.0-RC1 (7.1.2, 7.0.8) |
ContentSecurityPolicyNonceGeneratingFilter ve gelişmiş WebAuthn kayıt akışı |
'unsafe-inline' olmadan istek bazlı kriptografik CSP koruması |
| Spring Data & Session | Data 2026.0.2 / Session 4.2-RC1 | AOT derleme iyileştirmeleri ve dağıtık oturum yönetimi güncellemeleri | Spring Boot 4.1.2 ve 4.2.0-RC1 ile tam uyumluluk |
| Spring AI MCP & RAG | Spring AI 2.1.0-RC1 | Etkileşimli MCP Apps (AG-UI) ve ONNX tabanlı hızlı yerel gömülüm (embedding) | Ajan araçlarının zengin UI döndürmesi ve düşük gecikmeli RAG |
3. Örnek Mimari: JDK 28 Value Classes Uyumluluk Denetleyicisi ve Spring Security 7.2 CSP Nonce Yapılandırması
Aşağıdaki Java kodu, bir kurumsal uygulamanın JDK 28 --enable-preview modunda kimliksiz değer sınıflarını (Class::isValue) çalışma zamanında nasıl tespit ettiğini ve Spring Security 7.2.0-RC1 içindeki yeni ContentSecurityPolicyNonceGeneratingFilter mimarisinin nasıl kurgulandığını göstermektedir:
package com.tastutanlabs.jdk28.valhalla;
import java.time.LocalDate;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
public class Jdk28ValhallaAndCspAudit {
// JDK 28 --enable-preview altında 'value record' kimliksiz düzleştirilmiş bellekte yaşar
public record CspHeaderDirective(String nonceValue, LocalDate issuedDate) {}
/**
* OpenJDK Quality Outreach: 30 çekirdek JDK sınıfının çalışma zamanındaki
* kimlik (identity) durumunu ve '==' semantiğini doğrular.
*/
public static void inspectValhallaMigration() {
List<Class<?>> migratedCandidates = List.of(
Integer.class,
Optional.class,
LocalDate.class,
Record.class,
String.class // String kimlikli (identity) kalmaya devam eder
);
for (Class<?> clazz : migratedCandidates) {
boolean hasIdentity = clazz.isIdentity();
System.out.printf("Sınıf: %-22s | Identity Sınıfı mı?: %b%n",
clazz.getSimpleName(), hasIdentity);
}
// --enable-preview modunda önbellek dışı Integer örneklerinde '==' değer karşılaştırır
Integer a = Integer.valueOf(2026);
Integer b = Integer.valueOf(2026);
System.out.println("Integer.valueOf(2026) == Integer.valueOf(2026): " + (a == b));
}
/**
* Spring Security 7.2.0-RC1 ContentSecurityPolicyNonceGeneratingFilter
* tarafından üretilen istek bazlı CSP Nonce başlığını simüle eder.
*/
public static String buildSpringSecurity72CspHeader() {
String requestNonce = UUID.randomUUID().toString().replace("-", "");
CspHeaderDirective directive = new CspHeaderDirective(requestNonce, LocalDate.now());
return "script-src 'self' 'nonce-" + directive.nonceValue() + "'; object-src 'none';";
}
public static void main(String[] args) {
inspectValhallaMigration();
System.out.println("Üretilen CSP Başlığı: " + buildSpringSecurity72CspHeader());
}
}
4. Sonuç: Kütüphane Ekosisteminde Valhalla Hazırlığı
OpenJDK ekibinin JDK 28 Value Classes uyarısı, Java dünyasındaki tüm açık kaynak kütüphane ve kurumsal çatı (framework) geliştiricileri için erken bir eylem çağrısıdır. Integer, Optional ve LocalDate gibi her satırda kullanılan 30 temel sınıfın kimliksiz hale gelmesi, yığın bellekte (heap) nesne başlığı (object header) yükünü ve işaretçi takibini (pointer chasing) ortadan kaldırarak devasa bir performans sıçraması vaat ederken; synchronized(wrapper) veya kimlik tabanlı WeakHashMap kullanan eski kodların şimdiden temizlenmesini zorunlu kılmaktadır. Eş zamanlı olarak Spring Security 7.2.0-RC1 ve Spring AI MCP Apps yenilikleri, bu yüksek performanslı JVM çekirdeği üzerinde güvenli ve zengin etkileşimli bulut uygulamaları geliştirme standardını bir üst seviyeye taşımaktadır.
Kaynaklar
- Inside.java — OpenJDK Quality Outreach Heads-up (27 Ekim 2026, Nicolai Parlog): JDK 28: Value Classes (JEP 401) — 30 Core JDK Classes Migrated Under
--enable-previewand Compatibility Implications. - Spring.io Official Blog (27 Ekim 2026, Josh Long): This Week in Spring — October 27th, 2026: Spring Security 7.2.0-RC1, Spring Data 2026.0.2, Spring Session 4.2.0-RC1, and Spring LDAP 4.2.0-RC1.
- Spring Security 7.2 Release Notes & Craig Walls Spring AI Series (Ekim 2026):
ContentSecurityPolicyNonceGeneratingFilter, WebAuthn Enhancements, Rendering Rich UIs with MCP Apps, and Speeding Up RAG with Faster Embeddings.
Yazılım mimarisi, mikroservis ekosistemleri ve üretken yapay zeka uygulamaları üzerine çalışıyorum. TastutanLabs çatısı altında geliştirici araçları ve SaaS ürünleri inşa ediyorum.
Bu analizin 6 kartlık görsel özetini Instagram'da inceleyin ve kaydedin
Her gün yazılım mimarisi, Java/JVM ve yapay zeka gelişmelerini kendi başına okunabilen 6 slaytlık Mini-Blog serileri halinde paylaşıyoruz.
Yorumlar (0)
Düşüncelerinizi Paylaşın
Henüz yorum yapılmamış. İlk yorumu siz yapın!