Sobes.tech
Middle

Was ist der Unterschied zwischen Inversion of Control (IoC) und Dependency Injection?

sobes.tech KI

Antwort von AI

Die Inversion der Kontrolle (IoC) ist ein allgemeines Designprinzip, bei dem sich der Kontrollfluss eines Programms ändert: Anstatt Abhängigkeiten und deren Aufruflogik explizit zu verwalten, verlässt sich die Komponente auf ein externes Framework oder einen Container, der diesen Fluss steuert.

Die Dependency Injection (DI) ist eines der spezifischen Muster, die das IoC-Prinzip umsetzen. Es besteht darin, Abhängigkeiten (Objekte, von denen die aktuelle Komponente abhängt) von außen an die Komponente zu übergeben, anstatt dass die Komponente sie selbst erstellt oder sucht.

Daher ist DI eine Methode, um IoC zu erreichen.

Die wichtigsten Unterschiede:

  • IoC — Prinzip/Konzept.
  • DI — Muster/Implementierung.
  • IoC kann auf verschiedene Weisen implementiert werden (z.B. Fabrikmethode, Service-Locator), DI ist eine dieser Methoden.
  • IoC verschiebt die Verantwortung für die Erstellung und Bindung von Objekten von die Komponente zum Framework/Container.
  • DI führt diese Verschiebung durch, indem es Abhängigkeiten über Konstruktor, Setter oder Interface übergibt.

Beispiel für DI (Konstruktor):

// Klasse, die von Service abhängt
public class Client {
    private final Service service;

    // Konstruktor nimmt Abhängigkeit (Service) entgegen
    public Client(Service service) {
        this.service = service;
    }

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

// Abhängigkeits-Interface
public interface Service {
    void execute();
}

// Konkrete Implementierung der Abhängigkeit
public class ServiceImpl implements Service {
    @Override
    public void execute() {
        System.out.println("Dienst wird ausgeführt...");
    }
}

// Klasse, die für "Injection" verantwortlich ist
public class AppConfig {
    public static void main(String[] args) {
        Service myService = new ServiceImpl(); // Abhängigkeit erstellen
        Client client = new Client(myService); // Abhängigkeit über Konstruktor injizieren
        client.doSomething();
    }
}

In diesem Beispiel erstellt die Klasse Client ServiceImpl nicht direkt. Stattdessen wird ServiceImpl an anderer Stelle (AppConfig) erstellt und an Client übergeben (injiziert) durch den Konstruktor. Dies realisiert das IoC-Prinzip, da die Steuerung der Erstellung und Bindung von Service umgekehrt ist — sie liegt nicht in Client.