← Kursa Dön
📄 Text · 15 min

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:

  1. Constructor Injection (önerilen): Bağımlılık constructor parametresi olarak verilir

  2. Setter Injection: Setter metodu aracılığıyla verilir

  3. Field Injection: @Autowired ile 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

VersiyonYılÖnemli Özellikler
1.02004İlk resmi sürüm, XML-based config, IoC container
2.02006XML namespace desteği, AspectJ entegrasyonu
2.52007Annotation-based config (@Autowired, @Component)
3.02009Java-based config (@Configuration), SpEL, REST desteği
4.02013Java 8 desteği, WebSocket, generic types
5.02017Reactive programming (WebFlux), Kotlin desteği, Java 9+
5.32020Java 15 desteği, performans iyileştirmeleri
6.02022Java 17+ zorunlu, Jakarta EE 9+, AOT, virtual threads desteği
6.12023RestClient, JdbcClient, virtual threads iyileştirmeleri

Spring vs Java EE (Jakarta EE)

KriterSpringJava EE / Jakarta EE
KonfigürasyonConvention over ConfigurationSpesifikasyon tabanlı
EsneklikModüler, istediğini seçMonolitik uygulama sunucusu
TestKolay, mock desteğiArquillian vb. gerekli
ToplulukÇok aktif, hızlı evrimDaha yavaş, komite bazlı
Öğrenme EğrisiOrta (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.