Sobes.tech
Junior
169

Bog'lanishlarni injektsiya qilish (Dependency Injection) ning xususiyati nima?

AIdan javob

sobes.tech AI

Bog'liq bo'lgan bog'liqliklarni kiritish xususiyati (DI) shundan iboratki, ob'ektning bog'liqliklarini yaratish va boshqarish tashqariga, odatda IoC konteyneriga (Inversion of Control) o'tkaziladi. Ob'ekt o'z bog'liqliklarini o'zi yaratmay yoki topmay, ular tashqaridan unga "kiritiladi".

DI ning asosiy afzalliklari va xususiyatlari:

  • Mas'uliyatlarni bo'lish: Sinf o'z bog'liqliklarini yaratish uchun javobgar emas.
  • Test qilish mumkinligi: Modulli testlarda bog'liqliklar mock yoki to'siqlar bilan oson almashtiriladi.
  • Moslashuvchanlik: Bog'liqliklarning amalga oshirishlarini kodni o'zgartirmasdan o'zgartirish mumkin.
  • Kamroq bog'liqlik: Komponentlar kamroq bog'liq bo'lib, bu qo'llab-quvvatlashni yaxshilaydi.

Kiritish usullari:

  • Konstruktor orqali (Constructor Injection): Bog'liqliklar sinf konstruktoriga o'tkaziladi. Bu eng ma'qul usul bo'lib, ob'ekt yaratilganda bog'liqliklarning mavjudligini kafolatlaydi.

    // Bog'liqlikka ega sinf
    public class MyService {
        private MyDependency dependency;
    
        // Konstruktor orqali kiritish
        public MyService(MyDependency dependency) {
            this.dependency = dependency;
        }
    
        // Bog'liqlikdan foydalanish
        public void doSomething() {
            dependency.performAction();
        }
    }
    
    // Bog'liqlik
    public interface MyDependency {
        void performAction();
    }
    
    // Bog'liqlikning amalga oshirilishi misoli
    public class MyDependencyImpl implements MyDependency {
        @Override
        public void performAction() {
            System.out.println("Harakat bajarildi!");
        }
    }
    
  • Setter orqali (Setter Injection): Bog'liqliklar jamoat metodlari-setterlar orqali o'tkaziladi. Bu ob'ektlarni talab qilinadigan bog'liqliklar bilan yaratishga imkon beradi, lekin null tekshiruvlarini talab qiladi va barcha bog'liqliklarning bir vaqtning o'zida mavjudligini kafolatlamaydi.

    // Bog'liqlikka ega sinf
    public class AnotherService {
        private AnotherDependency dependency;
    
        // Bo'sh konstruktor
        public AnotherService() {
        }
    
        // Setter orqali kiritish
        public void setDependency(AnotherDependency dependency) {
            this.dependency = dependency;
        }
    
        // Bog'liqlikdan foydalanish
        public void doSomethingElse() {
            if (dependency != null) {
                dependency.anotherAction();
            } else {
                System.out.println("Bog'liqlik o'rnatilmagan!");
            }
        }
    }
    
    // Bog'liqlik
    public interface AnotherDependency {
        void anotherAction();
    }
    
    // Bog'liqlikning amalga oshirilishi misoli
    public class AnotherDependencyImpl implements AnotherDependency {
        @Override
        public void anotherAction() {
            System.out.println("Boshqa harakat bajarildi!");
        }
    }
    
  • Maydon orqali (Field Injection): Bog'liqliklar to'g'ridan-to'g'ri sinf maydonlariga anotatsiyalar yordamida kiritiladi. Eng oddiy sintaksis, lekin bu sinfni DI-ramkaga bog'laydi va test qilishni qiyinlashtiradi.

    import org.springframework.beans.factory.annotation.Autowired;
    
    // Bog'liqlikka ega sinf
    public class SomeOtherService {
    
        // Maydon orqali kiritish (Spring anotatsiyasi bilan)
        @Autowired
        private YetAnotherDependency dependency;
    
        // Bog'liqlikdan foydalanish
        public void doYetAnotherThing() {
            dependency.performYetAnotherAction();
        }
    }
    
    // Bog'liqlik
    public interface YetAnotherDependency {
        void performYetAnotherAction();
    }
    
    // Bog'liqlikning amalga oshirilishi misoli
    public class YetAnotherDependencyImpl implements YetAnotherDependency {
        @Override
        public void performYetAnotherAction() {
            System.out.println("Yana bir harakat bajarildi!");
        }
    }
    

Kiritish usullarining taqqoslanishi:

Kiritish usuli Afzalliklari Kamchiliklari
Konstruktor orqali Bog'liqliklarning mavjudligini kafolatlaydi, test qilish oson, o'zgarmas Konstruktorda "parametrozavodlik" muammosiga olib kelishi mumkin, agar bog'liqliklar ko'p bo'lsa
Setterni orqali Bog'liqliklarning ixtiyoriyligi, ob'ektni yaratgandan so'ng o'zgartirish imkoniyati Null tekshiruvlarini talab qiladi, ob'ektning to'liq holatini kafolatlamaydi
Maydon orqali Sintaksis qisqa, lekin DI-ramkaga bog'liq bo'lishi mumkin DI-ramka bilan bog'liq, test qilish qiyinlashadi

DI ko'plab zamonaviy ramkalar (masalan, Spring, CDI) da asosiy prinsip bo'lib, zaif bog'langan va oson test qilinadigan ilovalarni yaratishga yordam beradi.