Sobes.tech
Middle

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.