Abhängigkeitsinjektion (Dependency Injection) in Java: vollständiger Leitfaden

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum Dependency Injection ein Must-have für Java-Entwickler ist

Jeder Java-Entwickler stößt früher oder später auf das Problem der festen Kopplung von Code. Wenn eine Klasse direkt Instanzen anderer Klassen erstellt, wird das System spröde, schwer testbar und schwer zu modifizieren. Die Lösung dieses Problems ist Dependency Injection (DI). Dies ist eines der Schlüsselprinzipien der modernen Entwicklung, das Frameworks wie Spring und Jakarta EE zugrunde liegt.

In diesem Artikel werden wir untersuchen, was DI ist, wie es sich von IoC (Inversion of Control) unterscheidet, die drei Hauptmethoden der Abhängigkeitsinjektion in Java mit anschaulichen Codebeispielen betrachten und diskutieren, warum dieses Muster für die Erstellung wartbarer Anwendungen notwendig ist.



Was sind Dependency Injection und Inversion of Control?

Bevor wir zum Code übergehen, ist es wichtig, zwei grundlegende Konzepte zu verstehen.

Inversion of Control (IoC) ist ein allgemeines Prinzip, bei dem der Kontrollfluss des Programms an ein externes Framework oder einen Container übergeben wird. Anstatt dass der Code selbst entscheidet, wann Objekte erstellt und Methoden aufgerufen werden, übernimmt ein externes System diese Aufgabe.

Dependency Injection ist eine konkrete Implementierung des IoC-Prinzips. Es ist ein Muster, bei dem ein Objekt seine Abhängigkeiten (andere Objekte, von denen es abhängt) von außen erhält, anstatt sie selbst zu erstellen.

Einfach ausgedrückt: Anstatt dass die Klasse Car selbst einen Motor erstellt (new Engine()), erhält sie einen fertigen Motor über den Konstruktor oder Setter. Dies macht die Klasse Car unabhängig von einer konkreten Implementierung von Engine.



Drei Methoden der Abhängigkeitsinjektion in Java

In Java gibt es drei Hauptmethoden zur Implementierung von DI. Betrachten wir jede anhand eines einfachen Benachrichtigungssystems.



1. Konstruktor-Injektion (Constructor Injection)

Dies ist die am meisten empfohlene und sicherste Methode. Abhängigkeiten werden über den Konstruktor der Klasse übergeben. Dies stellt sicher, dass ein Objekt niemals in einem ungültigen Zustand erstellt wird, da alle notwendigen Abhängigkeiten obligatorisch sind.

// Interface für den Benachrichtigungsdienstpublic interface MessageService {    void sendMessage(String message, String recipient);}

// Implementierung für E-Mailpublic class EmailService implements MessageService { @Override public void sendMessage(String message, String recipient) { System.out.println("Email sent to " + recipient + ": " + message); }}

// Klasse, die den Benachrichtigungsdienst nutztpublic class NotificationSender { private final MessageService service; // Abhängigkeit

// Injektion über den Konstruktor public NotificationSender(MessageService service) { this.service = service; }

public void notifyUser(String user, String msg) { this.service.sendMessage(msg, user); }}

// Verwendungpublic class Main { public static void main(String[] args) { MessageService emailService = new EmailService(); NotificationSender sender = new NotificationSender(emailService); // DI sender.notifyUser("user@example.com", "Hello!"); }}


2. Setter-Injektion (Setter Injection)

Diese Methode wird verwendet, wenn die Abhängigkeit nicht obligatorisch ist oder nach der Erstellung des Objekts geändert werden kann. Die Abhängigkeit wird über eine öffentliche Setter-Methode übergeben.

public class NotificationSenderWithSetter {    private MessageService service; // Abhängigkeit ist nicht obligatorisch

// Setter für die Injektion public void setMessageService(MessageService service) { this.service = service; }

public void notifyUser(String user, String msg) { if (service != null) { this.service.sendMessage(msg, user); } else { System.out.println("No service configured!"); } }}

// Verwendung

Blogs

Buchempfehlungen