Sobes.tech
Junior

Qaysi bog'lanishlarni injektsiya qilish turlarini bilasiz?

sobes.tech AI

AIdan javob

Uchun uchta asosiy turi mavjud:

  1. Maydon orqali in'ektsiya (Field Injection): Bog'liqlik to'g'ridan-to'g'ri sinf maydoniga annotatsiya yordamida (masalan, Spring'da @Autowired) in'ektsiya qilinadi. Oson foydalaniladi, ammo birlik testlarini qiyinlashtiradi va yagona javobgarlik prinsipini buzadi, bog'liqliklarni yashiradi.

    // Maydon orqali in'ektsiya misoli
    public class MyService {
        // Bog'liqlik to'g'ridan-to'g'ri maydonga in'ektsiya qilinadi
        @Autowired
        private MyRepository repository;
    
        public void doSomething() {
            repository.getData();
        }
    }
    
  2. Setter orqali in'ektsiya (Setter Injection): Bog'liqlik ochiq setter metod orqali in'ektsiya qilinadi. Bu ixtiyoriy bo'lishi mumkin (majburiy emas), bajarilayotgan vaqtida bog'liqliklarni o'zgartirish uchun qulay (garchi kamdan-kam ishlatiladi). Ob'ektni yaratishda majburiy bog'liqlikni yaratmaydi.

    // Setter orqali in'ektsiya misoli
    public class MyService {
        private MyRepository repository;
    
        // Bog'liqlik setter orqali in'ektsiya qilinadi
        @Autowired
        public void setRepository(MyRepository repository) {
            this.repository = repository;
        }
    
        public void doSomething() {
            repository.getData();
        }
    }
    
  3. Konstruktor orqali in'ektsiya (Constructor Injection): Bog'liqlik konstruktor argumenti orqali in'ektsiya qilinadi. Bu tavsiya etiladi, chunki u bog'liqlik majburiyligini ta'minlaydi (uningsiz ob'ekt yaratilmaydi), unit testlarini osonlashtiradi (mock obyektlarni osongina o'tkazish mumkin) va sinf ehtiyojlarini aniq ko'rsatadi. Ob'ektlar, agar maydonlar final bo'lsa, o'zgarmas holga keltiradi.

    // Konstruktor orqali in'ektsiya misoli
    public class MyService {
        private final MyRepository repository; // Maydon final bo'lishi mumkin
    
        // Bog'liqlik konstruktor orqali in'ektsiya qilinadi
        @Autowired // Springning yangi versiyalarida, agar faqat bitta konstruktor bo'lsa, bu annotatsiya olib tashlanishi mumkin
        public MyService(MyRepository repository) {
            this.repository = repository;
        }
    
        public void doSomething() {
            repository.getData();
        }
    }
    

Taqqoslash jadvali:

In'ektsiya turi Bog'liqlik majburiyligi Foydalanish qulayligi Test qilish imkoniyati O'zgarmaslik
Maydon orqali Tanlov (yashirilgan) Yuqori Past Yo'q
Setter orqali Tanlov O'rtacha O'rtacha Yo'q
Konstruktor orqali Majburiy O'rtacha Yuqori Mümkin

Ko'p hollarda, konstruktor orqali in'ektsiya tavsiya etiladi.