PR

Guiceの入手方法

 Guiceは,2007年3月8日にバージョン1.0が公開され,ライセンスは,Apache License 2.0です。アノテーションやジェネリックを活用して作成されているため,Java SE 5.0以上が必須です。

 Guiceの公式サイトはGoogle code内のGuiceのページです。Guiceに関連するファイルは,公式サイトのダウンロード用ページでダウンロード可能です(図6)。このサイトで以下のようなファイルがダウンロードできます。

  • Guice本体(guice-1.0.zip)
  • User's Guide(Guice 1.0 User's Guide.pdf)
  • ソースコード(guice-1.0-src.zip)
  • など。

     User's Guideは英語ですが,かなり細かく書かれていて使用する際に参考になります。

    図6●Guiceのダウンロード・ページ
    図6●Guiceのダウンロード・ページ
    [画像のクリックで拡大表示]

     このサイトからGuice本体(guice-1.0.zip)をダウンロードすると,以下のJARファイルが含まれています。今回の記事では,主にguice-1.0.jar,guice-servlet-1.0.jar,guice-spring-1.0.jarを使用します。

    表2●アノテーションでのシングルトンの設定例
    JARファイル名 説明
    guice-1.0.jar Guiceを使用する場合には常に使用
    guice-servlet-1.0.jar Guiceを使用してWebアプリケーションを作成する場合に使用
    guice-spring-1.0.jar Springと連携する場合に使用
    guice-struts2-plugin-1.0.jar Struts2.0と連携する場合に使用
    aopalliance.jar AOPの機能を使用する場合に使用

    サンプル・アプリケーションを作ってみよう

     さっそく実際にサンプル・アプリケーションを作成してみましょう。Guiceの動きを確認するため,コンソール画面に「Hello, world!」を出力するアプリケーションを作成します。

     アプリケーション開発に利用する環境は以下の通りです。

     IDE       :Eclipse3.2.0
     Java      :Java SE 5.0 Update 11
     DIコンテナ:Guice 1.0
    

     作成は以下の手順で行います。

     1. 実行するサービスを作成(HelloService,HelloServiceImpl)
     2. インジェクションの対象(クライアント)を作成(Client)
     3. モジュールクラスを作成(Module)
     4. メインメソッドを作成(Main)
    

     それでは,実際に作成してみます。Guiceは,Guiceのサイトにあるguice-1.0.jarをクラスパスに含めるだけで使用することができます。

    手順1. 実行するサービスを作成

     まずは実行するサービスとそのインタフェースを作成します。これに関しては,特殊なことは何もなく,他のDIコンテナと同様にインタフェースとその実装クラスを作成します。

    
    package jp.co.nikkeibp.itpro.guice.hello;
    public interface HelloService {
        public void sayHello();
    }
    リスト4●サービスのインタフェース(HelloService.class)

     作成したインタフェースを実装したクラスを作成し,サービスの実際の処理を実装します。

    
    package jp.co.nikkeibp.itpro.guice.hello;
    public class HelloServiceImpl implements HelloService {
        public void sayHello() {
        System.out.println("Hello, world!");
        }
    }
    リスト5●サービスの実装クラス(HelloServiceImpl.class)

    手順2. インジェクションの対象(クライアント)を作成

     先ほど作成したサービスをインジェクションするクラスを作成します。@Injectを使用して,インジェクションの際に使用するメソッドを明示するのがポイントです。

    
    package jp.co.nikkeibp.itpro.guice.hello;
    import com.google.inject.Inject;
    public class Client {
        private HelloService helloService = null;
        @Inject
        public void setHelloService(HelloService helloService) {
        this.helloService = helloService;
        }
        public void execute() {
        helloService.sayHello();
        }
    }
    リスト6●インジェクションの対象クラス(クライアント)

    3. モジュールクラスの作成

     インジェクションの場所や実装クラスを指定するモジュールクラスを作成します。役割としては,Springを知っている方はbean定義ファイルをJavaで書く部分と思ってもらうとわかりやすいかもしれません。

     モジュールを作成する場合には,com.google.inject.AbstractModuleを継承して作成し,configureメソッドに設定を記述します。

     先ほど@Injectで指定した値にインジェクションする値を指定するため,bindメソッドの引数にリスト4で作成したインタフェース(HelloService.class)を,toメソッドにリスト5で作成した実装クラス(HelloServiceImpl.class)を指定します。

    
    package jp.co.nikkeibp.itpro.guice.hello;
    import com.google.inject.AbstractModule;
    public class Module extends AbstractModule {
        @Override
        protected void configure() {
        bind(HelloService.class).to(HelloServiceImpl.class);
        }
    }
    リスト7●モジュールクラス

    4. メインメソッドの作成

     最後に,クライアントを取得してそれを実行するメインメソッドを持ったクラスを作成します。リスト7で作成したモジュールクラスを,com.google.inject.Guice#createInjectorメソッドの引数に渡すことで,インジェクションの設定が反映されたインジェクタを作成し,そこからgetInstanceメソッドを使用してインジェクション済みのclientオブジェクトを取得します。

    
    package jp.co.nikkeibp.itpro.guice.hello;
    import com.google.inject.Guice;
    import com.google.inject.Injector;
    public class Main {
        public static void main(String[] args) {
        Module module = new Module();
        Injector injector = Guice.createInjector(module);
        Client client = injector.getInstance(Client.class);
        client.execute();
        }
    }
    リスト8●メインクラス

     リスト8のメインメソッドを実行すると以下のような実行結果になります。

    図7●「Hello, world!」を出力するサンプルの実行結果
    図7●「Hello, world!」を出力するサンプルの実行結果
    [画像のクリックで拡大表示]

     また,このアプリケーションのシーケンス図は図8の通りになります。

    図8●実行時のシーケンス図
    図8●実行時のシーケンス図
    [画像のクリックで拡大表示]

     以上のように,まったくXMLファイルを記述せずに「Hello, world!」を出力するアプリケーションを作成できました。すべてがJavaで完結するので,記述ミスなどがすぐわかり,コード補完などを利用して効率よく作成できるのが特徴です。