Sobes.tech
Junior
161

Aké typy injekcie závislostí poznáte?

Odpoveď od AI

sobes.tech AI

Existujú tri hlavné typy:

  1. Vkladanie cez pole (Field Injection): Závislosť sa priamo vkladá do poľa triedy pomocou anotácie (napríklad @Autowired v Springu). Jednoduché na použitie, ale sťažuje modulárne testovanie a narúša princíp jednotnej zodpovednosti tým, že skrýva závislosti.

    // Príklad vkladania cez pole
    public class MyService {
        // Závislosť sa vkladá priamo do poľa
        @Autowired
        private MyRepository repository;
    
        public void doSomething() {
            repository.getData();
        }
    }
    
  2. Vkladanie cez nastavovač (Setter Injection): Závislosť sa vkladá cez verejnú metódu-setter. Umožňuje voliteľne mať závislosť (nie je povinné ju nastaviť), je vhodné na zmenu závislostí počas behu (hoci sa to zriedka používa). Nezavádza povinnú závislosť pri vytváraní objektu.

    // Príklad vkladania cez setter
    public class MyService {
        private MyRepository repository;
    
        // Závislosť sa vkladá cez setter
        @Autowired
        public void setRepository(MyRepository repository) {
            this.repository = repository;
        }
    
        public void doSomething() {
            repository.getData();
        }
    }
    
  3. Vkladanie cez konštruktor (Constructor Injection): Závislosť sa vkladá cez argument konštruktora. Je preferovaná, pretože zabezpečuje povinnosť závislosti (bez nej objekt nemôže byť vytvorený), uľahčuje modulárne testovanie (ľahko je odovzdať mock objekty) a jasne deklaruje potreby triedy. Robí objekty nemennými po vytvorení, ak sú polia final.

    // Príklad vkladania cez konštruktor
    public class MyService {
        private final MyRepository repository; // Pole môže byť final
    
        // Závislosť sa vkladá cez konštruktor
        @Autowired // V novších verziách Springu je možné vynechať anotáciu @Autowired pre jediný konštruktor
        public MyService(MyRepository repository) {
            this.repository = repository;
        }
    
        public void doSomething() {
            repository.getData();
        }
    }
    

Porovnávacia tabuľka:

Typ vkladania Povinnosť závislosti Jednoduchosť použitia Testovateľnosť Nemennosť
Cez pole Voliteľná (skrytá) Vysoká Nízka Nie
Cez setter Voliteľná Stredná Stredná Nie
Cez konštruktor Povinná Stredná Vysoká Možná

V väčšine prípadov sa odporúča používať vkladanie cez konštruktor.