Google Guice: Framework für Dependency Injection

Seite 3: Der Injector als Schlüsselelement

Inhaltsverzeichnis

Abhängigkeiten verwaltet Guice in Form von Bindings, die aus zu erzeugendem Objekttyp, Annotation und Scope bestehen. Der Provider liefert das Objekt an den Injector (Abb. 2).

Schlüsselelement in der Guice- Struktur ist der Injector, der die Bindings verwaltet (Abbildung 2). Letztere verwenden eine Annotation am Injektionsziel und beziehen sich auf einen Typ, den es zu injizieren gilt. Der Provider erzeugt die Instanzen des Typs. Der Scope eines Bindings ist eine optionale Angabe und steuert das Wiederverwenden erzeugter und injizierter Objekte. Für jede Injektion legt Guice im Standardfall eine neue Instanz des betroffenen Objekts an. Alternative Scopes sind "Singleton", "Request" und "Session".

Über die beschriebenen grundlegenden Mechanismen hinaus kennt Guice etliche weiterführende Möglichkeiten. Dazu gehört die Definition eigener Annotationen, die beispielsweise eine zusätzliche Zuordnung von Flug- und Mietwagenbuchung erlaubt.

Wer Dependency Injection oder Inversion of Control hört, denkt in der Regel zuerst an Spring. Nicht zu Unrecht, handelt es sich doch um den De-facto-Standard, der eine aktive Community hinter sich versammelt hat. Wie schon erwähnt, sieht Google trotz dessen Existenz Bedarf für eine eigene Lösung. Auch Alternativen wie JBoss Seam, Apache HiveMind oder Pico-Container hielten das Unternehmen nicht von der Eigenentwicklung ab.

Beide Frameworks – Spring und Guice – gehören zu den Open-Source-Erzeugnissen und stehen unter der Apache-2.0- Lizenz. Annotations und Generics als Bestandteile von Guice erlauben die Nutzung erst ab Java 5. Für Spring gilt das nicht, es lässt sich selbst mit dem JDK 1.3 einsetzen und bietet deutlich mehr Funktionen als Guice. Während sich Letzteres auf DI konzentriert, unterstützt Spring zudem Transaktionen, Persistenz und besitzt ein eigenes Web-Framework. Subprojekte existieren für Konfiguration, Security, Batch-Jobs und einige andere mehr.

Die Definition von Abhängigkeiten zwischen Objekten bildet das Rückgrat eines DI-Framework. Wie die Abhängigkeiten hinterlegt und ausgewertet werden (Wiring der Objekte), ist eine kennzeichnende Eigenschaft. Hier zeigt sich ein weiterer wesentlicher Unterschied zwischen Spring und Guice. Spring erlaubt sowohl die explizite Darstellung als auch das Auto-Wiring. Guice verfolgt einen anderen Ansatz: Es setzt zwar auf eine explizite Darstellung, umgeht aber das geschwätzige XML-Format, indem es die Zusammenhänge über Java- Annotationen im Quellcode unterbringt. Dieses Vorgehen lässt sich als Mischung zwischen der ausführlichen, aber wartungsintensiven expliziten Darstellung und dem Auto- Wiring auffassen. Spring erlaubt mit JavaConfig ebenfalls das Anlegen von Abhängigkeiten im Java-Code, dieses Subprojekt befindet sich allerdings noch im Milestone-Zustand.