Java5の新しいオープンソースDIフレームワークであるGuiceのバージョン1.0がリリースされた。Guiceは、アノテーション駆動でSpringと異なり軽量なフレームワークを提供し、一貫した特徴がある。
Guiceは、XWorkのDIエンジンで、小さなサイズで高速に動作し、必要最低限のコードで利用できることを重点においている。
ユーザガイドから引用した簡単な例は、次のとおりである。
Guiceでは、モジュールを実装します。
メソッドの引数にbinderを渡し、インターフェースから実装へのマッピングのためにbinderを使用します。
以下のモジュールでは、GuiceがServiceクラスからServiceImplクラスへシングルトンスコープでマッピングしています。public class MyModule implements Module {
protected void configure(Binder binder) {
binder.bind(Service.class)
.to(ServiceImpl.class)
.in(Scopes.SINGLETON);
}
}Guiceでは、モジュールを見ればインジェクションしたいのが何かが分かります。
では、それをどこにインジェクトするかとういうことをどのように書けば良いのでしょうか?
Guiceでは、@Injectアノテーションをコンストラクタ、メソッド、フィールドにつけます。public class Client {
private final Service service;
@Inject
public Client(Service service) {
this.service = service;
}
public void go() {
service.go();
}
}開発者は、@Injectアノテーションによって、編集しているクラスのどのメンバーがインジェクトされるのかが明確になります。
Clientのインジェクトに対して、インスタンス生成を直接Guiceに問い合わせるか、他のクラスがインジェクトされたClientクラスをもたなければなりません。
プロジェクトリーダーの一人であるBob Lee氏は、SpringとGuiceの比較について書いている。
その中で、SpringとGuiceは、アノテーションに重点をおいているという点で大きく違っているように見える。
Guiceはアノテーションで一連を構成することができますが、Springはそれを勧めていない。
Guiceは、ジェネリクスをサポートするJava 5以降で動作する。
(この記事は2007年3月8日にリリースされた記事です)