Android+Guice その2
※2012・10 こちらのページにまとめるようにしてみました。
前回は準備編だったので今回はテスト編。簡単にInjectしてみる。
まずはInterfaceを定義する。この実装をGuiceを使ってClientにInjectする感じです。
続いてServiceの実装。 入力されたメッセージに対して琉球弁で挨拶します。
続いてサービスを利用する側Consumer。Clientクラス。
@Injectというアノテーションを利用するのでcom. google.inject.InjectをImportして、Injector側で注入して欲しいFieldには@Injectをつけておく。
やっている事は単純にServiceに対して自分の名前を送っているだけです。
あとはClientクラスのオブジェクトを作成してServiceの実装をInjectして利用するだけですが、Guiceは設定ファイルを使いません。どうやってオブジェクトのインスタンスを作ったら良いのかを定義するためのクラスを作ります。
このconfigure()の中で、オブジェクト作成時に要求された抽象クラスに対して、実際に作成して注入する具象クラスの関係を記述していきます。
bind(Abstract).to(Concrete);と書く事で、InjectorはAbstract Classのインスタンスが必要になった時に Concrete Classのオブジェクトを作成して注入してくれます。
この例ではClientクラスを作成するときにServiceインターフェースのFieldに@Injectアノテーションがついていますので、Default Constructorでオブジェクト作成後、Fieldに対してServiceImplクラスのインスタンスが注入されます。
この抽象クラスと具象クラスをリンクさせることをLinked Bindingsと呼びます。
こうして書くとModuleクラスは設定ファイルみたいな物ですがCompilerが名前を検証してくれるのでXML等の設定ファイルと違ってCompile時にクラス名の誤りを検出できます。
Guiceでは依存関係を持たないそれぞれのComponentを、Moduleで組み立てるイメージのようで、あるConsumerに対して別の実装を組み合わせた形でオブジェクトを作りたい場合、設定ファイルを変更するようにModuleを変更するよりもModuleをもう一つ実装して、その中で別のconfigure()を定義してやるという感じで使う事を想定しているんだと思います。多分(^_^;)
最後にこれらのテストを実行するためのファイルを作成します。
Injectorのインスタンスを先ほど作ったModuleを指定して作成します。
Injectorを作成するときにModuleは複数指定する事が出来ますので、複数のConsumerの作成方法はそれぞれ分離したファイルで管理する事が可能です。
Injectorが作成できたらgetInstance()を使って、インスタンスを作ってもらってそれを利用するだけです。
さて、実行してみましょう。コンパイルにも実行にも前回作ったdi.jarを使います。
ってことで基本は確認できたので次回はScopeの制御をしてみよう。