Spring Framework Nedir?
Giriş
Spring Framework, Java dünyasının en önemli ve en yaygın kullanılan uygulama geliştirme çatısıdır (framework). 2003 yılında Rod Johnson tarafından ortaya konulan bu framework, bugün milyonlarca geliştirici tarafından kullanılmakta ve kurumsal Java uygulamalarının bel kemiğini oluşturmaktadır. Bu derste Spring'in neden var olduğunu, hangi problemleri çözdüğünü ve temel felsefesini derinlemesine inceleyeceğiz.
J2EE'nin Problemleri ve Spring'in Doğuşu
2000'li yılların başında Java ile kurumsal uygulama geliştirmek istiyorsanız, J2EE (Java 2 Enterprise Edition) kullanmak zorunluydu. Ancak J2EE ciddi problemler barındırıyordu:
Aşırı karmaşıklık: Basit bir iş mantığı için bile düzinelerce XML konfigürasyon dosyası yazmanız gerekiyordu
Ağır EJB modeli: Enterprise JavaBeans (EJB 2.x) kullanımı son derece zordu, her bean için home interface, remote interface ve implementasyon sınıfı yazılmalıydı
Test edilemezlik: EJB'ler uygulama sunucusuna sıkı sıkıya bağlıydı, birim testi yazmak neredeyse imkansızdı
Yavaş geliştirme döngüsü: Her değişiklikte uygulamayı sunucuya deploy etmek gerekiyordu
Rod Johnson, 2002 yılında yayımladığı "Expert One-on-One J2EE Design and Development" kitabında bu problemleri detaylıca analiz etti ve EJB olmadan kurumsal uygulama geliştirmenin mümkün olduğunu gösterdi. Kitaptaki 30.000+ satırlık altyapı kodu, Spring Framework'ün temelini oluşturdu.
// J2EE / EJB 2.x ile basit bir servis (karmaşık!)
public class OrderServiceBean implements SessionBean {
private SessionContext ctx;
public void setSessionContext(SessionContext ctx) { this.ctx = ctx; }
public void ejbCreate() throws CreateException {}
public void ejbRemove() {}
public void ejbActivate() {}
public void ejbPassivate() {}
public void placeOrder(Order order) {
// İş mantığı burada
}
}
// Spring ile aynı servis (basit ve temiz!)
@Service
public class OrderService {
public void placeOrder(Order order) {
// İş mantığı burada
}
}IoC ve DI Felsefesi
Spring'in temel felsefesi iki kavram üzerine kuruludur:
Inversion of Control (IoC) — Kontrolün Tersine Çevrilmesi
Geleneksel programlamada nesneler kendi bağımlılıklarını kendileri oluşturur. IoC'de ise bu kontrol bir container'a (kapsayıcıya) devredilir. "Hollywood Principle" olarak da bilinir: *"Don't call us, we'll call you."*
// IoC OLMADAN — nesne kendi bağımlılığını oluşturur
public class OrderService {
private final EmailService emailService = new EmailService(); // Tight coupling!
}
// IoC İLE — bağımlılık dışarıdan verilir
public class OrderService {
private final EmailService emailService;
public OrderService(EmailService emailService) {
this.emailService = emailService; // Loose coupling!
}
}Dependency Injection (DI) — Bağımlılık Enjeksiyonu
DI, IoC'nin en yaygın uygulama biçimidir. Bir nesnenin ihtiyaç duyduğu bağımlılıklar, dışarıdan (genellikle Spring container tarafından) enjekte edilir. Üç yöntemi vardır:
Constructor Injection (önerilen): Bağımlılık constructor parametresi olarak verilir
Setter Injection: Setter metodu aracılığıyla verilir
Field Injection:
@Autowiredile doğrudan alana enjekte edilir
POJO-Based Development
Spring'in devrimsel yaklaşımlarından biri POJO (Plain Old Java Object) tabanlı geliştirmedir. Sınıflarınızın herhangi bir framework sınıfını extend etmesi veya implement etmesi gerekmez:
// POJO — hiçbir framework bağımlılığı yok
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User findById(Long id) {
return userRepository.findById(id);
}
}Bu sayede kodunuz test edilebilir, taşınabilir ve anlaşılır olur.
Spring Framework'ün Evrimi
| Versiyon | Yıl | Önemli Özellikler |
|---|---|---|
| 1.0 | 2004 | İlk resmi sürüm, XML-based config, IoC container |
| 2.0 | 2006 | XML namespace desteği, AspectJ entegrasyonu |
| 2.5 | 2007 | Annotation-based config (@Autowired, @Component) |
| 3.0 | 2009 | Java-based config (@Configuration), SpEL, REST desteği |
| 4.0 | 2013 | Java 8 desteği, WebSocket, generic types |
| 5.0 | 2017 | Reactive programming (WebFlux), Kotlin desteği, Java 9+ |
| 5.3 | 2020 | Java 15 desteği, performans iyileştirmeleri |
| 6.0 | 2022 | Java 17+ zorunlu, Jakarta EE 9+, AOT, virtual threads desteği |
| 6.1 | 2023 | RestClient, JdbcClient, virtual threads iyileştirmeleri |
Spring vs Java EE (Jakarta EE)
| Kriter | Spring | Java EE / Jakarta EE |
|---|---|---|
| Konfigürasyon | Convention over Configuration | Spesifikasyon tabanlı |
| Esneklik | Modüler, istediğini seç | Monolitik uygulama sunucusu |
| Test | Kolay, mock desteği | Arquillian vb. gerekli |
| Topluluk | Çok aktif, hızlı evrim | Daha yavaş, komite bazlı |
| Öğrenme Eğrisi | Orta (Boot ile düşük) | Yüksek |
Best Practices
İpucu: Spring öğrenmeye başlarken IoC ve DI kavramlarını iyi anlayın. Bu iki kavram Spring'in tüm modüllerinin temelidir.
Uyarı: Spring Framework ile Spring Boot'u karıştırmayın. Spring Framework temel çatıdır; Spring Boot ise bu çatı üzerine kurulmuş, geliştirmeyi kolaylaştıran bir araçtır.
Özet
Spring Framework, J2EE'nin karmaşıklığına bir tepki olarak doğmuş, IoC ve DI prensipleriyle Java dünyasını dönüştürmüş bir çatıdır. POJO tabanlı geliştirme yaklaşımı sayesinde temiz, test edilebilir ve bakımı kolay kodlar yazmanızı sağlar. Gelecek derslerde Spring Boot'un bu temeller üzerine nasıl inşa edildiğini göreceğiz.
AI Asistan
Sorularını yanıtlamaya hazır