Google hat das Open-Source-Release seines internen Java Dependency Injection Framework, Google Guice, bekannt gegeben. Das Framework wird unter der liberalen Apache 2.0 License vertrieben. Guice, ausgesprochen "juice", basiert auf Java 5-Feature wie Annotations und Generics. Neben Dependency Injection bietet das Framework eine Spring- und Struts2-Integration sowie Unterstüzung für eigene Scopes und AOP. Des Weiteren kommt Guice mit Konstruktoren, Feldern und Methoden (jede Methode mit einer Reihe von Argumenten). Weitere Features sind Custom Scopes, Circular Dependencies und Static Member Injection.
Dependency Injection mit Guice
Das Injizieren von Abhängigkeiten wird in Guice nicht mittels XML realisiert, sondern mit der @Inject-Annotation. Diese Annotation kann einfach vor dem Konstruktor der Klasse platziert werden:
@Inject
public CustomerService(CustomerDao dao, OrderDao order)
{
this.dao = dao;
this.order = order;
}
Interessant ist hier, dass der Konstruktor mehrere DAO-Interfaces entgegennimmt. Neben der komplexeren Konstruktor-Variante unterstützt Guice auch die einfachere setter-Variante des Dependency Injection:
@Inject
public void setCustomerDao(CustomerDao dao)
{
this.dao = dao;
}
Doch wie wird Guice nun mitgeteilt, welche Implementierungsklasse für welches (DAO-)Interface genommen werden soll? In Guice werden dazu Module programmiert:
public class MyModule implements Module {
public void configure(Binder binder) {
binder.bind(CustomerDao.class)
.to(CustomerDaoImpl.class)
.in(Scopes.SINGLETON);
...
} Der Binder legt in diesem Beispiel fest, dass für das CustomerDao-Interface die CustomerDaoImpl-Klasse genommen wird. Der Gültigkeitsbereich wird mit Scope.SINGLETON bestimmt. Um die einzelnen Module an das Guice-Framework zu übergeben, muss die main()-Methode der Anwendung Folgendes enthalten:
Injector injector = Guice.createInjector(new MyModule());
Die Methode createInjector() bedient sich der varargs-Syntax, so wird sichergestellt, dass Guice beliebig viele Module übergeben werden können. Das Erzeugen der CustomerService-Klasse funktioniert wie folgt:
CustomerService cs = injector.getInstance(CustomerService.class);
Interessante Alternative zu Spring
Guice stellt einen interessanten und leichtgewichtigen Ansatz dar. Für Anwendungen, die "nur ein wenig DI benötigen", ist Guice sicherlich eine interessante Wahl. Das Spring Framework bietet neben DI zahlreiche Feature, die nicht immer vollständig ausgenutzt werden. Interessant ist ebenfalls, dass Spring 2.0 auch mittels Java 5-Syntax konfigurierbar ist (siehe A Java configuration option for Spring"). Insgesamt ist Guice interessant genug, um es weiter zu beobachten.
Matthias Weßendorf arbeitet für die Oracle Corp. an dem ADF Faces-Projekt. Seit 2004 ist er PMC von Apache MyFaces. Matthias hat an verschiedenen internationalen Konferenzen als Redner teilgenommen. Derzeit ist er Rereäsentat der Apache Software Foundation im JSR 299 (Web Beans).














