Sobes.tech
Junior

Кайсы көзкаранды инжекторлорун түрлөрүн билесиз?

sobes.tech AI

AIден жооп

Барои се намудҳои асосӣ мавҷуд аст:

  1. Вуруд дар майдон (Field Injection): Вобастагӣ мустақиман ба майдони синф бо истифода аз аннотация (масалан, @Autowired дар Spring). Осон барои истифода, аммо мушкил мекунад тестгирии модулӣ ва вайрон мекунад принсипи масъулияти ягона, пинҳон кардани вобастагиҳо.

    // Намунаи вуруд дар майдон
    public class MyService {
        // Вобастагӣ мустақиман ба майдон ворид мешавад
        @Autowired
        private MyRepository repository;
    
        public void doSomething() {
            repository.getData();
        }
    }
    
  2. Вуруд тавассути сеттер (Setter Injection): Вобастагӣ тавассути усули умумии сеттер ворид мешавад. Имкон медиҳад, ки вобастагиро интихобӣ дошта бошад (наметавонад гузошта шавад), барои тағир додани вобастагиҳо дар вақти иҷро кардан қулай аст (гарчанде ки кам истифода мешавад). Вобастагии ҳатмиро дар вақти сохтани объект намекунад.

    // Намунаи вуруд тавассути сеттер
    public class MyService {
        private MyRepository repository;
    
        // Вобастагӣ тавассути сеттер ворид мешавад
        @Autowired
        public void setRepository(MyRepository repository) {
            this.repository = repository;
        }
    
        public void doSomething() {
            repository.getData();
        }
    }
    
  3. Вуруд тавассути конструктор (Constructor Injection): Вобастагӣ тавассути аргументи конструктор ворид мешавад. Ин беҳтар аст, зеро кафолат медиҳад, ки вобастагӣ ҳатмӣ аст (беъзи он, объект наметавонад сохта шавад), тестгирии модулӣ осон аст (модулҳоро ба осонӣ пешниҳод кардан мумкин аст) ва ниёзҳои синфро равшан нишон медиҳад. Объектҳоро пас аз сохтан тағирнопазир мекунад, агар майдонҳо final бошанд.

    // Намунаи вуруд тавассути конструктор
    public class MyService {
        private final MyRepository repository; // Майдон метавонад `final` бошад
    
        // Вобастагӣ тавассути конструктор ворид мешавад
        @Autowired // Дар версияҳои навтарини Spring, метавон аннотатсияро гузошт ё нагузошт
        public MyService(MyRepository repository) {
            this.repository = repository;
        }
    
        public void doSomething() {
            repository.getData();
        }
    }
    

Таблиғи муқоиса:

Навъи воридкунӣ Зарарнокии вобастаги Осонии истифода Тестгирӣ Ногузаришпазирӣ
Аз тариқи майдон Интихобӣ (пинҳоншуда) Баланд Низо Не
Аз тариқи сеттер Интихобӣ Миёна Миёна Не
Аз тариқи конструктор Зарарнокӣ Миёна Баланд Мумкин

Дар аксари ҳолатҳо тавсия дода мешавад, ки воридкунии тавассути конструктор истифода шавад.