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.