Googleによって作られた、軽量なJava用ディペンデンシーインジェクション(依存性注入)フレームワークである、Guiceの最新バージョン2.0がリリースされた。InfoQは、リリースの詳細と、Guiceの追加機能を知るために、GoogleのデベロッパチームメンバJesse Wilson氏と話をした。
Guiceの哲学は"目的を持てコードを書く"こと、アプリケーションフレームワークを書くことに時間を費やすことはビジネスの機能を書くことに時間を費やすことではない、とWilson氏は言う。Guiceの意図は、最小限の貫入性と、Javaに基づく設定とアノテーションに基づいたディペンデンシーインジェクションへの取り組みである。いったん初期オブジェクトグラフを生成し、全ての依存性を注入すると、ビジネスロジックが働き、もはや何も考える必要がない。フルスタックのエンタープライズアプリケーション開発フレームワークであるWebworxやSpringといったフレームワークと比較すると、Guiceは多くのエリアを統合するディペンデンシーインジェクションの核である。
今回のリリースに含まれる主な新機能は次のとおり。
- プロバイダメソッド - この機能は多くのカスタムプロバイダを作成する際に1.0で必要であった多くの定型コードを除去する。
- 改良されたモジュール機能 - バインディングオーバーライドやプライベートモジュールといった新機能は、優れたオーバーライドとモジュール設定の区分化を可能にする。
- 改善されたエラー報告 - もはやスタックトレースは長々とした 'caused by' の連鎖を含まない。さらに、例外のスローはGuiceの中で一貫性を持つ。
- AOP - GuiceはAOPを除いて、これをサポートしないプラットフォーム(例えばAndroidなど)に利用可能だ。さらに、OSGiと親和性のある方法でAOPを実施する。
- サーブレットサポート - サーブレットモジュールはプログラム的なサーブレットの設定と、web.xmlなしのフィルタをサポートする。
- イントロスペクション - java.lang.reflectと似て、イントロスペクトを実施し、Guiceの設定をプログラム的に変更することができる。
機能リスト一式はGoogle Guice wikiで、さらに、新機能の詳細な手引きは一連のブログ記事で入手可能である。
Wilson氏はプロバイダメソッドで実現する単純化の例を提供した。
インスタンスを提供するためにカスタムビジネスロジックをGuice 1.0で設定することは、以下のとおり非常に粗雑だ。bind(Integer.class) .annotatedWith(Names.named("lucky")) .toProvider(new Providerプロバイダメソッドは、これを実にきれいにする。() {
@Inject @Named("unlucky") int unlucky;
public Integer get() {
return unlucky * 7;
}
}).in(Singleton.class);@Provides @Named("lucky") @Singleton int provideLucky(@Named("unlucky") int unlucky) { return unlucky * 7; }
さらにWilson氏は、Guiceの利用とコミュニティの側面について語った。AdWordsといった、Google内の多くのプロジェクトでGuiceは利用されている。さらに、LimeWireやのようなGuiceのビッグユーザもいる。また、Java EEやOSGi、JBoss、Hibernate、JUnit 、JSFの統合を含むGuice用サードパーティモジュールリストも利用可能だ。Wilson氏は、Guiceコミュニティの活力と熱意に対して多くの賞賛を与え、このコミュニティがGuiceのC++やC#、GWT、PHPポートを作ったことを指摘した。今後の計画について、Wilson氏は、GuiceチームがリソースをJSR 330 Dependency Injectionへ提案することを示唆した。また、2.0リリースに組み込まれない、インジェクタ用の可視化グラフといった、いくつかの機能が今後のGuiceリリースで動作予定であると、同氏は語った。