© Excellent backgrounds/Shutterstock.com
Java Magazin
Schnelle DI für Java und Android

Dependency Injection mit Dagger

Dagger ist ein quelloffenes Dependency-Injection-(DI-)Framework, das auf Guice basiert. Allerdings waren die Entwickler von Dagger nicht mit dem Grundprinzip von Guice zufrieden: Immer wieder hatten sie in größeren Projekten Unmengen an Binding-Code zu schreiben. Da dies aber Teil der statischen Semantik ist, verfolgen sie die Strategie, dieses Binding zu extrahieren und in Form von Quelltext abzulegen. Ein weiteres Entwurfsziel ist die gute Lesbarkeit und Unterstützung beim Debugging-Prozess. Im Folgenden werden wir uns Dagger genauer ansehen und die ersten Schritte mit dem Framework gehen. Wir beschäftigen uns hier mit Dagger ab der Version 1.2.

Sven Ruppert


Eine der Besonderheiten von Dagger ist dessen Verfügbarkeit in Java- und Android-Systemen. Sehen wir uns ein einfaches Beispiel an und beginnen mit einem simplen @Inject einer Instanz (MainService) in unsere Main-Klasse (Listing 1).

Listing 1public class Main { @Inject MainService mainService; / ...}public interface MainService { public String execute(String txt);}public class MainServiceImpl implements MainService { public String execute(String txt){ return "MainServiceImpl _ " + txt; }}

Der erste Schritt, um eine Instanz einer Klasse mit injizierten Attributen zu erhalten, ist die Verwendung des Objektgraphen. Der ObjectGraph ist die Repräsentation aller Abhängigkeiten, die für eine Instanziierung notwendig sind. Im folgenden Listing ist die Initialisierung und Anwendung von Dagger in der Klasse Main zu sehen (Listing 2).

Listing 2? public class Main { @Inject MainService mainService; public static void main(String[] args) { // bootstrapping ObjectGraph objectGraph = ObjectGraph.create(new BusinessModule()); Main main = objectGraph.get(Main.class); // Main main = new Main(); // objectGraph.inject(main); System.out.println("execute = " + main.mainService.execute("Und Los")); System.out.println("execute = " + main.mainService.execute("Und Los")); System.out.println("execute = " + main.mainService.execute("Und Los")); }}

Es gibt bei Dagger zwei Wege, um an eine Instanz einer Klasse zu gelangen, die injizierte Attribute enthält. Der eine Weg geht über die Methode get(..) der Klasse ObjectGraph und liefert direkt eine fertige Instanz. Der andere Weg geht über den expliziten Aufruf der Methode inject(..) und kann auf bestehende Instanzen angewendet werden. Damit kann man den Zeitpunkt zwischen der Erzeugung der haltenden Klasseninstanz und den Membern selbst kontrollieren.

Es gibt noch eine Kleinigkeit zu beachten: Zur Erzeugung einer Instanz der Klasse ObjectGraph wird als Parameter der Methode create(..) noch ein Modul benötigt. In unserem Fall new BusinessModule(). In diesem Modul werden die Abhängigkeiten untereinander definiert; ebenso die Provider, die verwendet werden sollen:

@Module(library = false, injects = {Main.class}, complete = true)public class BusinessModule { @Provides MainService provideMainService() { return new MainServiceImpl(); }}

In dem Provider kann entweder die Instanz selbst erzeugt werden, oder man kann Injection über Methodenparameter verwenden (nachfolgendes Listing). Hier ist Folgendes z...

Java Magazin
Schnelle DI für Java und Android

Dependency Injection mit Dagger

Dagger ist ein quelloffenes Dependency-Injection-(DI-)Framework, das auf Guice basiert. Allerdings waren die Entwickler von Dagger nicht mit dem Grundprinzip von Guice zufrieden: Immer wieder hatten sie in größeren Projekten Unmengen an Binding-Code zu schreiben. Da dies aber Teil der statischen Semantik ist, verfolgen sie die Strategie, dieses Binding zu extrahieren und in Form von Quelltext abzulegen. Ein weiteres Entwurfsziel ist die gute Lesbarkeit und Unterstützung beim Debugging-Prozess. Im Folgenden werden wir uns Dagger genauer ansehen und die ersten Schritte mit dem Framework gehen. Wir beschäftigen uns hier mit Dagger ab der Version 1.2.

Sven Ruppert


Eine der Besonderheiten von Dagger ist dessen Verfügbarkeit in Java- und Android-Systemen. Sehen wir uns ein einfaches Beispiel an und beginnen mit einem simplen @Inject einer Instanz (MainService) in unsere Main-Klasse (Listing 1).

Listing 1public class Main { @Inject MainService mainService; / ...}public interface MainService { public String execute(String txt);}public class MainServiceImpl implements MainService { public String execute(String txt){ return "MainServiceImpl _ " + txt; }}

Der erste Schritt, um eine Instanz einer Klasse mit injizierten Attributen zu erhalten, ist die Verwendung des Objektgraphen. Der ObjectGraph ist die Repräsentation aller Abhängigkeiten, die für eine Instanziierung notwendig sind. Im folgenden Listing ist die Initialisierung und Anwendung von Dagger in der Klasse Main zu sehen (Listing 2).

Listing 2? public class Main { @Inject MainService mainService; public static void main(String[] args) { // bootstrapping ObjectGraph objectGraph = ObjectGraph.create(new BusinessModule()); Main main = objectGraph.get(Main.class); // Main main = new Main(); // objectGraph.inject(main); System.out.println("execute = " + main.mainService.execute("Und Los")); System.out.println("execute = " + main.mainService.execute("Und Los")); System.out.println("execute = " + main.mainService.execute("Und Los")); }}

Es gibt bei Dagger zwei Wege, um an eine Instanz einer Klasse zu gelangen, die injizierte Attribute enthält. Der eine Weg geht über die Methode get(..) der Klasse ObjectGraph und liefert direkt eine fertige Instanz. Der andere Weg geht über den expliziten Aufruf der Methode inject(..) und kann auf bestehende Instanzen angewendet werden. Damit kann man den Zeitpunkt zwischen der Erzeugung der haltenden Klasseninstanz und den Membern selbst kontrollieren.

Es gibt noch eine Kleinigkeit zu beachten: Zur Erzeugung einer Instanz der Klasse ObjectGraph wird als Parameter der Methode create(..) noch ein Modul benötigt. In unserem Fall new BusinessModule(). In diesem Modul werden die Abhängigkeiten untereinander definiert; ebenso die Provider, die verwendet werden sollen:

@Module(library = false, injects = {Main.class}, complete = true)public class BusinessModule { @Provides MainService provideMainService() { return new MainServiceImpl(); }}

In dem Provider kann entweder die Instanz selbst erzeugt werden, oder man kann Injection über Methodenparameter verwenden (nachfolgendes Listing). Hier ist Folgendes z...

Neugierig geworden?


    
Loading...

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang