Sobes.tech
Junior

Hangi bağımlılık enjeksiyonu türlerini biliyorsunuz?

sobes.tech yapay zeka

AI'dan gelen yanıt

Üç ana tür vardır:

  1. Alan Enjeksiyonu (Field Injection): Bağımlılık, anotasyon (örneğin, Spring'de @Autowired) kullanılarak doğrudan sınıf alanına enjekte edilir. Kullanımı kolaydır, ancak birim testlerini zorlaştırır ve tek sorumluluk ilkesini ihlal eder, bağımlılıkları gizler.

    // Alan enjeksiyonu örneği
    public class MyService {
        // Bağımlılık doğrudan alan içine enjekte edilir
        @Autowired
        private MyRepository repository;
    
        public void doSomething() {
            repository.getData();
        }
    }
    
  2. Setter Enjeksiyonu (Setter Injection): Bağımlılık, kamuya açık bir setter yöntemi aracılığıyla enjekte edilir. Bağımlılığın isteğe bağlı olmasına izin verir (zorunlu değil), çalışma zamanında bağımlılıkları değiştirmek için uygundur (nadiren kullanılır). Nesne oluşturulurken zorunlu bağımlılık oluşturmaz.

    // Setter enjeksiyonu örneği
    public class MyService {
        private MyRepository repository;
    
        // Bağımlılık, setter aracılığıyla enjekte edilir
        @Autowired
        public void setRepository(MyRepository repository) {
            this.repository = repository;
        }
    
        public void doSomething() {
            repository.getData();
        }
    }
    
  3. Yapıcı Enjeksiyonu (Constructor Injection): Bağımlılık, yapıcı (constructor) argümanı aracılığıyla enjekte edilir. Tercih edilir, çünkü bağımlılığın zorunlu olduğunu garanti eder (on olmadan nesne oluşturulamaz), birim testlerini kolaylaştırır (moc nesneleri kolayca geçilebilir) ve sınıfın ihtiyaçlarını açıkça belirtir. Nesneleri, alanlar final ise, değiştirilemez hale getirir.

    // Yapıcı enjeksiyonu örneği
    public class MyService {
        private final MyRepository repository; // Alan final olabilir
    
        // Bağımlılık, yapıcı aracılığıyla enjekte edilir
        @Autowired // Spring'in yeni sürümlerinde, yalnızca bir yapıcı varsa bu anotasyon kaldırılabilir
        public MyService(MyRepository repository) {
            this.repository = repository;
        }
    
        public void doSomething() {
            repository.getData();
        }
    }
    

Karşılaştırmalı tablo:

Enjeksiyon Türü Bağımlılık Zorunluluğu Kullanım Kolaylığı Test Edilebilirlik Değiştirilebilirlik
Alan aracılığıyla Opsiyonel (gizli) Yüksek Düşük Hayır
Setter aracılığıyla Opsiyonel Orta Orta Hayır
Yapıcı aracılığıyla Zorunlu Orta Yüksek Mümkün

Çoğu durumda, yapıcı enjeksiyon kullanımı önerilir.