Sobes.tech
Junior

Koje vrste injekcije zavisnosti poznajete?

sobes.tech АИ

Одговор од АИ

Postoje tri osnovne vrste:

  1. Ubacivanje putem polja (Field Injection): Zavisnost se direktno ubacuje u polje klase pomoću anotacije (na primer, @Autowired u Springu). Jednostavno za korišćenje, ali otežava modularno testiranje i narušava princip jedinstvene odgovornosti, skrivajući zavisnosti.

    // Primer ubacivanja putem polja
    public class MyService {
        // Zavisnost se direktno ubacuje u polje
        @Autowired
        private MyRepository repository;
    
        public void doSomething() {
            repository.getData();
        }
    }
    
  2. Ubacivanje putem setera (Setter Injection): Zavisnost se ubacuje putem javne metode-settera. Omogućava opcionalno postojanje zavisnosti (nije obavezno da se postavi), zgodno za promenu zavisnosti tokom izvršavanja (mada se retko koristi). Ne stvara obaveznu zavisnost pri kreiranju objekta.

    // Primer ubacivanja putem setera
    public class MyService {
        private MyRepository repository;
    
        // Zavisnost se ubacuje putem setera
        @Autowired
        public void setRepository(MyRepository repository) {
            this.repository = repository;
        }
    
        public void doSomething() {
            repository.getData();
        }
    }
    
  3. Ubacivanje putem konstruktora (Constructor Injection): Zavisnost se ubacuje putem argumenta konstruktora. Prednost je što obezbeđuje obaveznost zavisnosti (bez nje objekat ne može biti kreiran), olakšava modularno testiranje (lako je proslediti mock objekte) i jasno deklarise potrebe klase. Čini objekte nepromenljivim nakon kreiranja ako su polja final.

    // Primer ubacivanja putem konstruktora
    public class MyService {
        private final MyRepository repository; // Polje može biti final
    
        // Zavisnost se ubacuje putem konstruktora
        @Autowired // U novijim verzijama Springa može se preskočiti anotacija @Autowired za jedini konstruktor
        public MyService(MyRepository repository) {
            this.repository = repository;
        }
    
        public void doSomething() {
            repository.getData();
        }
    }
    

Uporedna tabela:

Vrsta ubacivanja Obaveznost zavisnosti Jednostavnost korišćenja Testabilnost Nemogućnost menjanja
Preko polja Opcionalno (skriveno) Visoka Niska Ne
Preko setera Opcionalno Srednja Srednja Ne
Preko konstruktora Obavezno Srednja Visoka Moguće

U većini slučajeva preporučuje se korišćenje ubacivanja putem konstruktora.