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.