Guice(ジュースと読む)は、
DIとは依存性の注入(Dependency Injection)のことで、
DIフレームワークは、
Guiceのダウンロード
Guiceのバイナリモジュールはguice-1.
ソースコードは、
それでは、
基礎編
ここでは基礎編として、
DIの設定
GuiceによるDIの設定は以下の手順で行います。これらは他のDIフレームワークとほぼ同様で、
- 1) インターフェースを作成する
- 2) 具象クラス(依存性のもと)を作成する
- 3) 1)と2)とを対応させる(DIの設定をする)モジュールを作成する
- 4) 2)を実行するためのクラスを作成する
1) インターフェースを作成する
まず、
リスト1 インターフェースの作成
public interface Play {
// メソッドの中身は具象クラスで実装する
void play();
}
2) 具象クラス(依存性のもと)を作成する
1)で作成したインターフェースを実装した具象クラスを作成します(リスト2-1)。DIフレームワークでは、
なお、
リスト2-1 1)のインターフェースを実装した具象クラス
// 設定時に参照できるようにstaticにしている
static class PlayImpl implements Play {
// 実装されたメソッド
public void play() {
System.out.println( "何かしてあそぶ!" );
}
リスト2-2 別の具象クラスの例(1)
static class Baseball implements Play
public void play() {
System.out.println( "野球してあそぶ!" );
}
}
リスト2-3 別の具象クラスの例(2)
static class Soccer implements Play {
public void play() {
System.out.println( "サッカーしてあそぶ!" );
}
}
3) 1)と2)とを対応させる(DIの設定をする)モジュールを作成する
1)で作成したインターフェースと、
Guiceでは、
リスト3 インターフェースと具象クラスとを対応させるモジュール
class PlayModule extends AbstractModule {
protected void configure()
// PlayImplクラスを対応させる(この場合はSingletonとする)
bind( Play.class ).to( PlayImpl.class ).in( Scopes.SINGLETON );
// 別の具象クラスを対応させる場合(例)
// bind( Play.class ).to( Baseball.class ).in( Scopes.SINGLETON );
// bind( Play.class ).to( Soccer.class ).in( Scopes.SINGLETON );
}
}
4) 2)を実行するためのクラスを作成する
DIフレームワークでは、
2)を実行するクラスをリスト4のように作成しました。Guiceでは、
具体的には、
ちなみに、
リスト4 Guiceによりインスタンスを生成されるクラス
class Player implements Play {
private final Play play;
// コンストラクタにより具象クラス(依存性)を注入される
// (コンストラクタ・インジェクション)
ここまでで、
インスタンスの生成と実行
Guiceによる依存性が注入されたインスタンスの生成は、
- 5) 3)の処理を行うクラスのインスタンスを生成する
- 6) 4)のインスタンスを生成する
- 7) 6)を実行する
5) 3)の処理を行うクラスのインスタンスを生成する
3)でインターフェースと具象クラスとを対応付けるモジュールを作成しましたが、
Injector injector = Guice.createInjector( new PlayModule() );
createInjector()メソッドの引数に、
6) 4)のインスタンスを生成する
5)で作成したInjectorにより4)のインスタンスを生成します。このとき3)の設定に基づいて、
Play play = injector.getInstance( Player.class );
7) 6)のインスタンスを実行する
6)で生成したインスタンスのメソッドを実行します。
play.play();
これで
GuiceによるDIの設定からインスタンスの生成と実行までの一連の流れが理解できたところで、
後編は4/