V čem spočívá rozdíl mezi inverzí řízení (IoC) a vkládáním závislostí?
sobes.tech AI
Odpověď od AI
Obrácení řízení (IoC) je obecný návrhový princip, podle kterého se mění tok řízení programu: místo explicitního řízení závislostí a logiky jejich volání se komponenta spoléhá na externí rámec nebo kontejner, který tento tok řídí.
Vkládání závislostí (DI) je jeden z konkrétních vzorů, které implementují princip IoC. Spočívá v předání závislostí (objektů, na kterých závisí aktuální komponenta) komponentě zvenčí, místo aby je komponenta sama vytvářela nebo hledala.
Tedy, DI je způsob, jak dosáhnout IoC.
Hlavní rozdíly:
- IoC — princip/koncepce.
- DI — vzor/implementace.
- IoC může být realizováno různými způsoby (například továrním vzorem, lokalizátorem služeb), DI je jedním z těchto způsobů.
- IoC přesouvá odpovědnost za tvorbu a spojování objektů z komponenty na rámec nebo kontejner.
- DI realizuje tento přesun předáváním závislostí přes konstruktor, setter nebo rozhraní.
Příklad DI (konstruktor):
// třída závislá na Service
public class Client {
private final Service service;
// Konstruktor přijímá závislost (Service)
public Client(Service service) {
this.service = service;
}
public void doSomething() {
service.execute();
}
}
// rozhraní závislosti
public interface Service {
void execute();
}
// konkrétní implementace závislosti
public class ServiceImpl implements Service {
@Override
public void execute() {
System.out.println("Provádím službu...");
}
}
// třída odpovědná za "vložení"
public class AppConfig {
public static void main(String[] args) {
Service myService = new ServiceImpl(); // vytvoření závislosti
Client client = new Client(myService); // vložení závislosti přes konstruktor
client.doSomething();
}
}
V tomto příkladu třída Client přímo nevytváří ServiceImpl. Místo toho je ServiceImpl vytvořen jinde (AppConfig) a předán (vložen) do Client přes jeho konstruktor. To realizuje princip IoC, protože řízení tvorby a spojování Service je invertováno — není v Client.