Asılılıqların injeksiyası (Dependency Injection) xüsusiyyəti nədir?
sobes.tech Süni İntellekt
AI-dan cavab
Asılılıq injekciyası (DI) xüsusiyyətində əsas odur ki, obyektin asılılıqlarının yaradılması və idarə olunması obyektin özündən kənara çıxarılır, adətən IoC konteynerində (Inversion of Control). Obyekt öz asılılıqlarını yaratmaq və ya tapmaq əvəzinə, onlar xaricdən ona "inject" edilir.
DI-nin əsas üstünlükləri və xüsusiyyətləri:
- Məsuliyyətlərin bölünməsi: Sinif öz asılılıqlarını yaratmaq üçün məsuliyyət daşımır.
- Test ediləbilərlik: Asılılıqlar modulların testində asanlıqla mock və ya stub ilə əvəz oluna bilər.
- Əlverişlilik: Asılılıqların həyata keçirilməsini dəyişdirmək kodu dəyişdirmədən mümkündür.
- Daha az bağlılıq: Komponentlər daha az sıx bağlı olur, bu da dəstəyi yaxşılaşdırır.
İmplementasiya üsulları:
-
Konstruktor vasitəsilə (Constructor Injection): Asılılıqlar sinifin konstruktoru vasitəsilə ötürülür. Bu ən tövsiyə olunan üsuldur, çünki obyektin yaradılma anından asılılıqların mövcudluğunu təmin edir.
// Asılılığa malik sinif public class MyService { private MyDependency dependency; // Konstruktor vasitəsilə inject public MyService(MyDependency dependency) { this.dependency = dependency; } // Asılılıqdan istifadə public void doSomething() { dependency.performAction(); } } // Asılılıq public interface MyDependency { void performAction(); } // Asılılığın nümunə həyata keçirilməsi public class MyDependencyImpl implements MyDependency { @Override public void performAction() { System.out.println("Hərəkət yerinə yetirildi!"); } } -
Setter vasitəsilə (Setter Injection): Asılılıqlar ictimai setter metodları vasitəsilə ötürülür. Bu, obyektləri tələb olunan asılılıqlarla yaratmağa imkan verir, lakin null yoxlamalarını tələb edir və bütün asılılıqların dərhal mövcud olmasını təmin etmir.
// Asılılığa malik sinif public class AnotherService { private AnotherDependency dependency; // Boş konstruktor public AnotherService() { } // Setter vasitəsilə inject public void setDependency(AnotherDependency dependency) { this.dependency = dependency; } // Asılılıqdan istifadə public void doSomethingElse() { if (dependency != null) { dependency.anotherAction(); } else { System.out.println("Asılılıq təyin edilməyib!"); } } } // Asılılıq public interface AnotherDependency { void anotherAction(); } // Asılılığın nümunə həyata keçirilməsi public class AnotherDependencyImpl implements AnotherDependency { @Override public void anotherAction() { System.out.println("Başqa hərəkət yerinə yetirildi!"); } } -
Sahə vasitəsilə (Field Injection): Asılılıqlar sinifin sahələrinə birbaşa anotasiya ilə inject edilir. Bu ən sadə sintaksisdir, lakin sinfi DI-çərçivəsinə asılı edir və test etməyi çətinləşdirir.
import org.springframework.beans.factory.annotation.Autowired; // Asılılığa malik sinif public class SomeOtherService { // Sahə vasitəsilə inject (Spring anotasiya ilə) @Autowired private YetAnotherDependency dependency; // Asılılıqdan istifadə public void doYetAnotherThing() { dependency.performYetAnotherAction(); } } // Asılılıq public interface YetAnotherDependency { void performYetAnotherAction(); } // Asılılığın nümunə həyata keçirilməsi public class YetAnotherDependencyImpl implements YetAnotherDependency { @Override public void performYetAnotherAction() { System.out.println("Yana bir hərəkət yerinə yetirildi!"); } }
İmplementasiya üsullarının müqayisəsi:
| Üsul | Üstünlüklər | Dezavantajlar |
|---|---|---|
| Konstruktor vasitəsilə | Asılılıqların mövcudluğunu təmin edir, test etmək asandır, dəyişməz | Konstruktor parametrlərinin çoxluğu ilə "parametr asılılığı" yarana bilər |
| Setter vasitəsilə | Asılılıqların seçimliliyi, obyektin yaradılmasından sonra dəyişdirilməsi imkanı | Null yoxlamaları tələb edir, obyektin tam vəziyyətini təmin etmir |
| Sahə vasitəsilə | Qısa sintaksis | DI-çərçivəsinə güclü asılılıq, test etmək çətinləşir |
DI, müasir çərçivələrdə (məsələn, Spring, CDI) əsas prinsipdir və zəif bağlı və asan test edilə bilən tətbiqlər yaratmağa kömək edir.