Mi a különbség az irányítási fordítás (IoC) és a függőséginjektálás között?
sobes.tech MI
Válasz az MI-től
Az irányítás fordítása (IoC) egy általános tervezési elv, amely szerint egy program irányítási folyamata megváltozik: ahelyett, hogy explicit módon kezelné a függőségeket és azok hívási logikáját, a komponens egy külső keretrendszerre vagy konténerre támaszkodik, amely ezt a folyamatot irányítja.
A függőséginjektálás (DI) az egyik olyan mintázat, amely megvalósítja az IoC elvet. Ez magában foglalja a függőségek (az objektumok, amelyekben a jelenlegi komponens függ) külső átadását a komponensnek, ahelyett, hogy a komponens maga hozná létre vagy keresné azokat.
Ezért a DI az IoC elérésének egyik módja.
Fő különbségek:
- IoC — elv/koncepció.
- DI — minta/megvalósítás.
- Az IoC különböző módokon valósítható meg (pl. gyárfüggvény, szolgáltatáskereső), a DI ezek egyike.
- Az IoC áthelyezi a felelősséget az objektumok létrehozásáért és összekapcsolásáért a komponens től a keretrendszerhez/konténerhez.
- A DI ezt az áthelyezést hajtja végre, a függőségek átadásával a konstruktoron, setteren vagy interfészen keresztül.
DI példa (konstruktor):
// a Service-től függő osztály
public class Client {
private final Service service;
// A konstruktor fogadja a függőséget (Service)
public Client(Service service) {
this.service = service;
}
public void doSomething() {
service.execute();
}
}
// függőségi interfész
public interface Service {
void execute();
}
// konkrét függőség megvalósítása
public class ServiceImpl implements Service {
@Override
public void execute() {
System.out.println("Szolgáltatás végrehajtása...");
}
}
// osztály, amely felelős a "befecskendezésért"
public class AppConfig {
public static void main(String[] args) {
Service myService = new ServiceImpl(); // függőség létrehozása
Client client = new Client(myService); // függőség injektálása a konstruktoron keresztül
client.doSomething();
}
}
Ebben a példában a Client osztály nem hozza létre közvetlenül a ServiceImpl-t. Ehelyett a ServiceImpl máshol (AppConfig) jön létre, és átadódik (befecskendezik) a Client-nek a konstruktorán keresztül. Ez valósítja meg az IoC elvet, mivel a Service létrehozásának és összekapcsolásának irányítása megfordul — nem a Client-ben van.