© Excellent backgrounds/Shutterstock.com
Java Magazin
Ein Segen für Java-Entwickler?

Dependency Injection mit Boon

Mit Boon DI widmen wir uns nach Dagger (siehe S. 60) einem weiteren Vertreter der Gattung Dependency-Injection-Frameworks. Das Projekt selbst stellt einige weitere Module/Packages bereit, auf die wir im Weiteren nicht eingehen werden. Hier werden wir uns lediglich die DI-Eigenschaften ansehen.

Sven Ruppert


In der Einleitung zu Boon DI kann man lesen, dass es Dagger ähnlich sein soll, aber auf den erweiterten Compile-Prozess verzichtet. Ebenfalls werden einige Qualifier angeboten, die namentlich denen aus den Frameworks Spring, Seam, Guice und „plain“ CDI (Contexts and Dependency Injection) gleichen. Eine Besonderheit vorweg: Es gibt den Qualifier @Inject einmal im Package org.boon.di; bei der Verwendung kann man allerdings auch auf javax.inject.Inject zurückgreifen. Die gemischte Verwendung ist ebenfalls möglich.

Erzeugungsreihenfolge

Bei der Verwendung von DI-Frameworks ist es von Interesse, die Reihenfolge der Instanziierungen zu kennen. Um dies zu ermitteln, verwende ich folgende Hilfsklasse: PrintInfo (Listing 1).

Listing 1public class PrintInfo { public static void printInfo(Class aClass){ final Method[] declaredMethods = aClass.getDeclaredMethods(); String txt = ""; for (final Method declaredMethod : declaredMethods) { txt = txt + " - " + declaredMethod.getName(); } System.out.println(aClass.getSimpleName() + " -> " + txt); }}

Das erste Beispiel ist nun eine einfache Instanziierung. Hier wird ein Service mit einem Attribut vom Typ SubService per @Inject versorgt (Listing 2).

Listing 2public class MainStep001 { public static void main(String[] args) { final Service service = new Service(); service.printInfo(); // CDI not working final Module module = DependencyInjection.classes(Service.class); final Service service1 = module.get(Service.class); service1.printInfo(); // factory Methods are now available final Context context = DependencyInjection.context(module); final Service service2 = context.get(Service.class); service2.printInfo(); }}public class Service { @Inject SubService subService; public void printInfo(){ PrintInfo.printInfo(this.getClass()); if(subService == null){ System.out.println("subService = " + subService); } else{ subService.printInfo(); } } @PostConstruct public void printInfoPostconstruct(){ System.out.println("printInfoPostconstruct() " + this.getClass().getSimpleName()); }}public class SubService { public void printInfo(){ PrintInfo.printInfo(this.getClass()); } @PostConstruct public void printInfoPostconstruct(){ System.out.println("printInfoPostconstruct() " + this.getClass().getSimpleName()); }}

In unserem Fall wird zuerst die letzte Instanziierung in der Kette durchgeführt. Es wird zunächst der SubService instanziiert,...

Java Magazin
Ein Segen für Java-Entwickler?

Dependency Injection mit Boon

Mit Boon DI widmen wir uns nach Dagger (siehe S. 60) einem weiteren Vertreter der Gattung Dependency-Injection-Frameworks. Das Projekt selbst stellt einige weitere Module/Packages bereit, auf die wir im Weiteren nicht eingehen werden. Hier werden wir uns lediglich die DI-Eigenschaften ansehen.

Sven Ruppert


In der Einleitung zu Boon DI kann man lesen, dass es Dagger ähnlich sein soll, aber auf den erweiterten Compile-Prozess verzichtet. Ebenfalls werden einige Qualifier angeboten, die namentlich denen aus den Frameworks Spring, Seam, Guice und „plain“ CDI (Contexts and Dependency Injection) gleichen. Eine Besonderheit vorweg: Es gibt den Qualifier @Inject einmal im Package org.boon.di; bei der Verwendung kann man allerdings auch auf javax.inject.Inject zurückgreifen. Die gemischte Verwendung ist ebenfalls möglich.

Erzeugungsreihenfolge

Bei der Verwendung von DI-Frameworks ist es von Interesse, die Reihenfolge der Instanziierungen zu kennen. Um dies zu ermitteln, verwende ich folgende Hilfsklasse: PrintInfo (Listing 1).

Listing 1public class PrintInfo { public static void printInfo(Class aClass){ final Method[] declaredMethods = aClass.getDeclaredMethods(); String txt = ""; for (final Method declaredMethod : declaredMethods) { txt = txt + " - " + declaredMethod.getName(); } System.out.println(aClass.getSimpleName() + " -> " + txt); }}

Das erste Beispiel ist nun eine einfache Instanziierung. Hier wird ein Service mit einem Attribut vom Typ SubService per @Inject versorgt (Listing 2).

Listing 2public class MainStep001 { public static void main(String[] args) { final Service service = new Service(); service.printInfo(); // CDI not working final Module module = DependencyInjection.classes(Service.class); final Service service1 = module.get(Service.class); service1.printInfo(); // factory Methods are now available final Context context = DependencyInjection.context(module); final Service service2 = context.get(Service.class); service2.printInfo(); }}public class Service { @Inject SubService subService; public void printInfo(){ PrintInfo.printInfo(this.getClass()); if(subService == null){ System.out.println("subService = " + subService); } else{ subService.printInfo(); } } @PostConstruct public void printInfoPostconstruct(){ System.out.println("printInfoPostconstruct() " + this.getClass().getSimpleName()); }}public class SubService { public void printInfo(){ PrintInfo.printInfo(this.getClass()); } @PostConstruct public void printInfoPostconstruct(){ System.out.println("printInfoPostconstruct() " + this.getClass().getSimpleName()); }}

In unserem Fall wird zuerst die letzte Instanziierung in der Kette durchgeführt. Es wird zunächst der SubService instanziiert,...

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