気になる開発プロダクツ

第1回[前編] Guice 1.0 - GoogleからリリースされたDIフレームワーク

この記事を読むのに必要な時間:およそ 3 分

4) 2)を実行するためのクラスを作成する

DIフレームワークでは,2)のインスタンスをを直接生成させるのではなく,2)を内包するクラスを別に作成しておき,そのインスタンスを生成します。そうすることで,注入される具象クラス(依存性)が入れ替わっても,処理上は同じクラスのインスタンスを生成することになるので,これを利用するほかのクラスには,具象クラスを入れ替えたことによる影響が及びません。

2)を実行するクラスをリスト4のように作成しました。Guiceでは,依存性を注入する箇所にアノテーション@Injectを付記します。ここではコンストラクタに付記されていますので,コンストラクタにより具象クラス(依存性)が注入されるコンストラクタ・インジェクションが行われることになります。

具体的には,このクラスのコンストラクタの引数でPlayインターフェースが指定されているため,Guiceによってインスタンスが生成される際には,3)により対応付けられた2)の具象クラスが注入されます。

ちなみに,@Injectがメソッドに付記されれば,メソッドを通じて依存性が注入されるメソッド・インジェクションが行われます。メソッド名がsetXXXXXの場合をとくにセッター(setter)・インジェクションと呼びます。

リスト4 Guiceによりインスタンスを生成されるクラス

  class Player implements Play  {
    private final Play play;
    // コンストラクタにより具象クラス(依存性)を注入される
    // (コンストラクタ・インジェクション)<
    @Inject
    public Player( Play play )  {
      this.play = play;
    }
    // 注入された具象クラスのメソッドを実行
    public void play()  {
      play.play();
    }
  }

ここまでで,基本的なDIの設定が完了しました。それではGuiceを使ってインスタンスを生成してみましょう。

インスタンスの生成と実行

Guiceによる依存性が注入されたインスタンスの生成は,先ほどのDIの設定から続けて以下の手順で行います。

  • 5) 3)の処理を行うクラスのインスタンスを生成する
  • 6) 4)のインスタンスを生成する
  • 7) 6)を実行する
5) 3)の処理を行うクラスのインスタンスを生成する

3)でインターフェースと具象クラスとを対応付けるモジュールを作成しましたが,Guiceではこの処理を実際に行うインスタンスとしてInjectorを生成します。具体的には,以下を実行します。

Injector injector = Guice.createInjector( new PlayModule() );

createInjector()メソッドの引数に,3)で作成したクラスのインスタンスを指定します。そうすると,このInjectorを用いた依存性の注入時には3)の処理が行われることになります。

6) 4)のインスタンスを生成する

5)で作成したInjectorにより4)のインスタンスを生成します。このとき3)の設定に基づいて,4)には2)が注入されます。インスタンスの生成時に1)や2)のクラス名などが一切記述されないことが,DIフレームワークを扱うメリットです。これによって,注入される具象クラス(依存性)がどんなものであろうと,すべて同じクラスのインスタンスとして扱うことができるのです。

Play play = injector.getInstance( Player.class );
7) 6)のインスタンスを実行する

6)で生成したインスタンスのメソッドを実行します。

play.play();

これで「何かしてあそぶ!」というメッセージが表示されるはずです。リスト3を変更すれば,リスト2-2やリスト2-3を実行させることができます。依存性の入れ替えが簡単にできることがおわかりいただけるでしょう。

GuiceによるDIの設定からインスタンスの生成と実行までの一連の流れが理解できたところで,続く後編では設定の応用について解説します。

後編は4/17(火)に公開予定。

著者プロフィール

沖林正紀(おきばやしまさのり)

SE/プログラマを経て,WebアプリケーションやXMLなどについて雑誌記事や書籍の執筆活動を始める。大手メーカで製品資料の作成や,セミナーの講師を担当したこともある。現在は,取材記事や製品レビューなどに執筆活動の幅を広げる一方,プログラミング教材の開発も手がけている。

著書