Sobes.tech
Junior

Bağımlılık Enjeksiyonu (Dependency Injection) özelliği nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Bağımlılık Enjeksiyonu (DI) özelliği, bir nesnenin bağımlılıklarının oluşturulması ve yönetiminin nesnenin kendisinden dışarıya, genellikle IoC konteynerine (Inversion of Control) devredilmesidir. Nesne kendi bağımlılıklarını oluşturmak veya bulmak yerine, bunlar dışarıdan "enjekte edilir".

DI'nin temel avantajları ve özellikleri:

  • Sorumlulukların ayrılması: Sınıf, bağımlılıklarını oluşturmakla sorumlu değildir.
  • Test edilebilirlik: Bağımlılıklar, modüler testlerde kolayca taklitler veya sahte nesnelerle değiştirilebilir.
  • Esneklik: Bağımlılıkların uygulamalarını, kullanan kodu değiştirmeden kolayca değiştirmek mümkündür.
  • Daha az bağlılık: Bileşenler daha az sıkı bağlı hale gelir, bu da bakımını kolaylaştırır.

Enjeksiyon yöntemleri:

  • Yapıcı (Constructor) aracılığıyla (Constructor Injection): Bağımlılıklar, sınıfın yapıcısı aracılığıyla geçirilir. Bu en tercih edilen yöntemdir, çünkü nesne oluşturulurken bağımlılıkların varlığını garanti eder.

    // Bağımlılığı olan sınıf
    public class MyService {
        private MyDependency dependency;
    
        // Yapıcı aracılığıyla enjeksiyon
        public MyService(MyDependency dependency) {
            this.dependency = dependency;
        }
    
        // Bağımlılığı kullanma
        public void doSomething() {
            dependency.performAction();
        }
    }
    
    // Bağımlılık
    public interface MyDependency {
        void performAction();
    }
    
    // Bağımlılık uygulaması
    public class MyDependencyImpl implements MyDependency {
        @Override
        public void performAction() {
            System.out.println("İşlem gerçekleştirildi!");
        }
    }
    
  • Setter aracılığıyla (Setter Injection): Bağımlılıklar, kamuya açık setter metodları aracılığıyla geçirilir. Gerektiğinde nesneler oluşturulabilir, ancak null kontrolleri gerektirir ve tüm bağımlılıkların hemen varlığını garanti etmez.

    // Bağımlılığı olan sınıf
    public class AnotherService {
        private AnotherDependency dependency;
    
        // Boş yapıcı
        public AnotherService() {
        }
    
        // Setter aracılığıyla enjeksiyon
        public void setDependency(AnotherDependency dependency) {
            this.dependency = dependency;
        }
    
        // Bağımlılığı kullanma
        public void doSomethingElse() {
            if (dependency != null) {
                dependency.anotherAction();
            } else {
                System.out.println("Bağımlılık ayarlanmadı!");
            }
        }
    }
    
    // Bağımlılık
    public interface AnotherDependency {
        void anotherAction();
    }
    
    // Bağımlılık uygulaması
    public class AnotherDependencyImpl implements AnotherDependency {
        @Override
        public void anotherAction() {
            System.out.println("Başka bir işlem gerçekleştirildi!");
        }
    }
    
  • Alan aracılığıyla (Field Injection): Bağımlılıklar, sınıfın alanlarına doğrudan anotasyonlar kullanılarak enjekte edilir. En kısa sözdizimine sahiptir, ancak sınıf DI çerçevesine bağımlı hale gelir ve çerçeve olmadan testleri zorlaştırır.

    import org.springframework.beans.factory.annotation.Autowired;
    
    // Bağımlılığı olan sınıf
    public class SomeOtherService {
    
        // Alan aracılığıyla enjeksiyon (Spring anotasyonu kullanılarak)
        @Autowired
        private YetAnotherDependency dependency;
    
        // Bağımlılığı kullanma
        public void doYetAnotherThing() {
            dependency.performYetAnotherAction();
        }
    }
    
    // Bağımlılık
    public interface YetAnotherDependency {
        void performYetAnotherAction();
    }
    
    // Bağımlılık uygulaması
    public class YetAnotherDependencyImpl implements YetAnotherDependency {
        @Override
        public void performYetAnotherAction() {
            System.out.println("Başka bir işlem gerçekleştirildi!");
        }
    }
    

Enjeksiyon yöntemlerinin karşılaştırması:

Enjeksiyon Yöntemi Avantajlar Dezavantajlar
Yapıcı aracılığıyla Bağımlılıkların varlığını garanti eder, testleri kolaylaştırır, değiştirilemez Çok sayıda bağımlılık varsa "parametre bağımlılığı" oluşturabilir
Setter aracılığıyla Opsiyonel bağımlılıklar, bağımlılıkların değiştirilmesine olanak tanır Null kontrolleri gerektirir, nesnenin tam durumu garanti edilmez
Alan aracılığıyla Söz dizimi kısadır DI çerçevesine yüksek bağımlılık, çerçeve olmadan testleri zorlaştırır

DI, birçok modern frameworkte (örneğin Spring, CDI) temel ilkedir ve zayıf bağlı ve kolay test edilebilir uygulamaların oluşturulmasına katkıda bulunur.