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çinTek constructor varsa @Autowired yazmaya gerek yoktur (Spring 4.3+). Lombok'un @RequiredArgsConstructor'ı yaygın kullanılır.
Constructor injection neden daha iyi?
- Alanlar
finalolabilir, 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.
İlgili Java & Spring soruları
- Java 21 virtual thread'ler nedir? Platform thread'lerden farkı nedir ve hangi durumlarda dikkatli olmak gerekir?
- ExecutorService ve CompletableFuture ile asenkron iş nasıl yapılır? Thread pool boyutunu nasıl belirlersiniz?
- JPA/Hibernate'te lazy ve eager loading farkı nedir? LazyInitializationException neden oluşur ve nasıl çözülür?
- @Transactional anotasyonu hangi durumlarda çalışmaz? Self-invocation, rollback kuralları ve propagation tuzaklarını açıklayın.
- Spring bean scope'ları nelerdir? Singleton bir bean'e prototype bean inject edilirse ne olur?
- Java'da Garbage Collection nasıl çalışır? G1 ve ZGC arasındaki farklar nelerdir, hangisini ne zaman seçersiniz?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.