Sobes.tech
Middle

V čom spočíva rozdiel medzi invertovaním riadenia (IoC) a vstavovaním závislostí?

sobes.tech AI

Odpoveď od AI

Inverzia riadenia (IoC) je všeobecný princíp návrhu, podľa ktorého sa mení tok riadenia programu: namiesto toho, aby ste explicitne riadili závislosti a logiku ich volania, komponent sa spolieha na vonkajší rámec alebo kontajner, ktorý tento tok riadi.

Závislostná injekcia (DI) je jeden z konkrétnych vzorov implementujúcich princíp IoC. Spočíva v odovzdávaní závislostí (objektov, od ktorých závisí aktuálny komponent) komponentu zvonku, namiesto toho, aby ich komponent vytváral alebo ich sám hľadal.

Takže DI je spôsob, ako dosiahnuť IoC.

Hlavné rozdiely:

  • IoC — princíp/koncept.
  • DI — vzor/implementácia.
  • IoC môže byť realizovaný rôznymi spôsobmi (napríklad továrenská metóda, lokátor služieb), DI je jeden z týchto spôsobov.
  • IoC presúva zodpovednosť za vytváranie a viazanie objektov z komponentu na rámec/kontajner.
  • DI realizuje toto presunutie odovzdávaním závislostí cez konštruktor, nastavovač alebo rozhranie.

Príklad DI (konštruktor):

// trieda závislá od Service
public class Client {
    private final Service service;

    // Konštruktor prijíma závislosť (Service)
    public Client(Service service) {
        this.service = service;
    }

    public void doSomething() {
        service.execute();
    }
}

// Rozhranie závislosti
public interface Service {
    void execute();
}

// Konkrétna implementácia závislosti
public class ServiceImpl implements Service {
    @Override
    public void execute() {
        System.out.println("Executing service...");
    }
}

// Trieda zodpovedná za "vloženie"
public class AppConfig {
    public static void main(String[] args) {
        Service myService = new ServiceImpl(); // Vytvorenie závislosti
        Client client = new Client(myService); // Vloženie závislosti cez konštruktor
        client.doSomething();
    }
}

V tomto príklade trieda Client nevytvára ServiceImpl priamo. Namiesto toho sa ServiceImpl vytvorí niekde inde (AppConfig) a odovzdá sa (vloží) do Client cez jeho konštruktor. Toto realizuje princíp IoC, pretože riadenie vytvárania a viazania Service je invertované - nie je v Client.