SeamFramework.org Community Documentation

- 前のページ
- 次のページ

## 第28章 Guice 統合

Google Guice は、タイプセーフな依存性解決による軽量の依存性注入を提供するライブラリです。Guice 統合(Seam IoC モジュールの一部)は、`@Guice` アノテーションを付加したすべての Seam コンポーネントに Guice インジェクションを利用可能にします。Seam が実行する(オプションとなる)通常のバイジェクションに加えて、Seam はコンポーネントの依存関係を満足させるために、既知の Guice インジェクタへの委譲も行います。Guice は大規模なあるいはレガシーなアプリケーションの非 Seam 部分を Seam と結び付けるのに役立つかもしれません。

## 注意

Guice 統合は jboss-seam-ioc ライブラリにバンドルされています。この依存関係はこの章でカバーするすべての統合テクニックに必要とされます。またクラスパスに Guice jar ファイルが必要となります。

## 28.1. ハイブリッド Seam-Guice コンポーネント作成

ゴールはハイブリッドな Seam-Guice コンポーネントを作成することです。これを実現するためのルールはとても簡単です。もしあなたの Seam コンポーネントで Guice インジェクションを使用したければ、( `org.jboss.seam.ioc.guice.Guice` タイプをインポートした後で) `@Guice` アノテーションを付与してください。

    @Name("myGuicyComponent")

    @Guice public class MyGuicyComponent

    {

       @Inject MyObject myObject;

       @Inject @Special MyObject mySpecialObject;

       ...

    }

この Guice インジェクションは、バイジェクションと同じようにすべてのメソッド呼び出しで実行できるでしょう。Guice は、タイプとバインディングに基づいてインジェクトを行います。前の例で依存関係を解決させるために、アプリケーションで `@Special` アノテーションが定義されたところで Guice モジュールの以下の実装をバインディングさせます。

    public class MyGuicyModule implements Module

    {

       public void configure(Binder binder)

       {

          binder.bind(MyObject.class)

             .toInstance(new MyObject("regular"));

          binder.bind(MyObject.class).annotatedWith(Special.class)

             .toInstance(new MyObject("special"));

       }

    }

すばらしい、しかしどの Guice インジェクタが依存関係をインジェクトするために使用されるのでしょうか。まあ、まずはいくつかのセットアップを実行する必要があります。

## 28.2. インジェクタの設定

Seam コンポーネントディスクリプタ(components.xml)で Guice 初期化コンポーネントのインジェクションプロパティにフックすることによって、Seam にどの Guice インジェクタを使用するかを指定します :

    <components xmlns="http://jboss.com/products/seam/components"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xmlns:guice="http://jboss.org/products/seam/guice"

       xsi:schemaLocation="

          http://jboss.com/products/seam/guice

          http://jboss.com/products/seam/guice-2.2.xsd

          http://jboss.com/products/seam/components

          http://jboss.com/products/seam/components-2.2.xsd">

       <guice:init injector="#{myGuiceInjector}"/>

    </components

    >

`myGuiceInjector` は、Guice `Injector` インタフェースを実装するSeam コンポーネントのインジェクションを解決しなければいけません。

しかしインジェクタの作成に必要になるのは、定型のコードです。本当にできるようにしたいことは、Guice モジュール への Seam のフックです。幸運にも、まさにそれをするために `Injector` インタフェースを実装する組み込みの Seam コンポーネントがあります。Seam コンポーネントディスクリプタに以下の一節を追加することで それを設定することができます。

    <guice:injector name="myGuiceInjector">

       <guice:modules

    >

          <value

    >com.example.guice.GuiceModule1</value

    >

          <value

    >com.example.guice.GuiceModule2</value

    >

       </guice:modules

    >

    </guice:injector

    >

もちろん、アプリケーションのその他の部分、おそらくは Seam 以外の部分ですでに使われたインジェクタを使うこともできます。これは Guice 統合を作成する主なモチベーションの一つです。インジェクタはEL表現で定義されるので、気に入ったいかなる方法でもそれを取得することができます。例えば、インジェクタを提供するために、Seam ファクトリコンポーネントパターンを使用してもよいです。

    @Name("myGuiceInjectorFactory")

    public InjectorFactory

    {

       @Factory(name = "myGuiceInjector", scope = APPLICATION, create = true)

       public Injector getInjector()

       {

          // Your code that returns injector

       }

    }

## 28.3. 複数インジェクタの利用

デフォルトでは、Seam コンポーネントディスクリプタで設定されたインジェクタが使用されます。もし本当に複数のインジェクタを使う必要があれば(私の知っている限りでは、代わりに複数のモジュールを使うべきです)、`@Guice` アノテーションで各々の Seam コンポーネントに異なるインジェクタを指定することができます。

    @Name("myGuicyComponent")

    @Guice("myGuiceInjector")

    public class MyGuicyComponent

    {

       @Inject MyObject myObject;

       ...

    }

以上これですべてです。実際の Seam Guice 統合を見てSeam ディストリビューションの中にある Guice サンプルを調べてください。

- 前のページ第27章 Spring Framework 統合
- 上に戻る
- ホーム
- 次のページ第29章 Hibernate Search