Google Guice
# Google Guice

Google Guice ist ein Open-Source-Framework für Dependency Injection mit Java. Guice wurde von Google erstmals 2008 unter der Apache-Lizenz veröffentlicht. Als damals erstes Framework ermöglicht Guice Dependency Injection mittels Annotationen. 2008 gewann es den Jolt Award für das beste Framework.

## Dependency Injection (DI) und Inversion of Control (IoC)

Inversion of Control ist ein Pattern in der Software-Entwicklung, bei dem Programme ihre Abhängigkeiten (d. h. Programmteile oder Komponenten, von denen sie selbst abhängen) nicht selbst erzeugen, sondern sich von außen „herein geben“ lassen. Dieses Prinzip ist grundsätzlich ohne Dependency Injection möglich, wird aber mit Dependency Injection wesentlich vereinfacht. Dependency Injection sieht dabei vor, dass die Komponenten nicht vom Nutzer selbst erzeugt werden, sondern über einen „Injector“ (so der Name in Google Guice) erzeugt werden. Dieser Injector kann für alle notwendigen „Unterkomponenten“ konkrete Objekte erzeugen und somit auch das angeforderte, oft komplexe Objekt bereitstellen. Hierfür werden für den Injector die zu verwendenden konkreten Klassen (z. B. für Interfaces) angegeben. In Google Guice wird dies über sog. Module durchgeführt.

## Module in Google Guice

Module in Guice fassen die zu verwendenden Abhängigkeiten eines bestimmten „Themengebietes“ zusammen. Wie weit dieses „Thema“ gefasst wird, ist dem einzelnen Programmierer überlassen und kann von Software-Projekt zu Software-Projekt sehr stark variieren. Gemeinsam ist den Modulen, dass sie zu (oft abstrakten) Abhängigkeiten im Projekt konkrete, zu verwendende Klassen mappen bzw. „binden“. So kann z. B. festgelegt werden, dass an jeder Stelle, wo ein Typ vom Interface „MailSender“ verwendet wird, ein Objekt vom Typ „NetworkMailSender“ injiziert wird. Durch das zentrale Mapping der zu verwendenden Typen in den Modulen des Injectors können die tatsächlich verwendeten Objekte sehr einfach ausgetauscht werden. So können z. B. in Unit-Tests sehr einfach Mock-Objekte (z. B. MailSenderMock) für das Interface „MailSender“ gebunden werden, die die Funktion des Mail-Versendens simulieren und somit einfache, schnelle, unabhängige und stabile TestCases möglich machen.

## Scopes

Für die zu verwendenden Objekte kann festgelegt werden, wie lange die einmal erzeugten Objekte „gecacht“ (d. h. wiederverwendet) werden sollen. Diese Angaben werden in Guice „Scope“ genannt. Die populärsten Scopes sind dabei der „Default-Scope“ (keine explizite Scope-Angabe), bei dem bei jeder Anforderung des Typs ein neues Objekt erzeugt wird, oder der „Singleton-Scope“, bei dem programmweit – gesteuert durch den Injector – nur ein Objekt von diesem Typ existiert. Die Scopes können für die eigenen Zwecke erweitert werden.

