Spring'de Dependency Injection nedir? Constructor injection neden field injection'a tercih edilir?

Cevap

Dependency Injection (DI), bir sınıfın ihtiyaç duyduğu bağımlılıkları kendisinin new ile oluşturması yerine dışarıdan (Spring IoC container'dan) almasıdır. Container, @Component, @Service, @Repository, @Bean ile tanımlanan bean'leri oluşturur ve birbirine bağlar.

Üç injection yöntemi

// 1) Constructor injection (önerilen)
@Service
public class OrderService {
    private final PaymentClient paymentClient;
    private final OrderRepository repo;

    public OrderService(PaymentClient paymentClient, OrderRepository repo) {
        this.paymentClient = paymentClient;
        this.repo = repo;
    }
}

// 2) Field injection (önerilmez)
@Autowired private PaymentClient paymentClient;

// 3) Setter injection: opsiyonel bağımlılıklar için

Tek constructor varsa @Autowired yazmaya gerek yoktur (Spring 4.3+). Lombok'un @RequiredArgsConstructor'ı yaygın kullanılır.

Constructor injection neden daha iyi?

  • Alanlar final olabilir, nesne her zaman tam kurulmuş halde oluşur.
  • Birim testte Spring olmadan new OrderService(mockClient, mockRepo) ile test edilebilir; reflection gerekmez.
  • Çok fazla parametre olması "bu sınıf fazla iş yapıyor" sinyalidir (SRP ihlali).
  • Döngüsel bağımlılıklar başlangıçta hata verir; Spring Boot 2.6+ varsayılan olarak circular reference'ları yasaklar.

Aynı tipte birden fazla bean varsa

@Primary ile varsayılanı belirleyin veya @Qualifier("stripe") ile hangisini istediğinizi seçin.

  1. Java 21 virtual thread'ler nedir? Platform thread'lerden farkı nedir ve hangi durumlarda dikkatli olmak gerekir?OrtaJava & SpringBackend
  2. ExecutorService ve CompletableFuture ile asenkron iş nasıl yapılır? Thread pool boyutunu nasıl belirlersiniz?OrtaJava & SpringBackend
  3. JPA/Hibernate'te lazy ve eager loading farkı nedir? LazyInitializationException neden oluşur ve nasıl çözülür?OrtaJava & SpringBackend
  4. @Transactional anotasyonu hangi durumlarda çalışmaz? Self-invocation, rollback kuralları ve propagation tuzaklarını açıklayın.ZorJava & SpringBackend
  5. Spring bean scope'ları nelerdir? Singleton bir bean'e prototype bean inject edilirse ne olur?KolayJava & SpringBackend
  6. Java'da Garbage Collection nasıl çalışır? G1 ve ZGC arasındaki farklar nelerdir, hangisini ne zaman seçersiniz?ZorJava & SpringBackend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle