SeamFramework.orgCommunity Documentation

第28章 Guice 統合

28.1. ハイブリッド Seam-Guice コンポーネント作成
28.2. インジェクタの設定
28.3. 複数インジェクタの利用

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

注意

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

ゴールはハイブリッドな 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 インジェクタが依存関係をインジェクトするために使用されるのでしょうか。まあ、まずはいくつかのセットアップを実行する必要があります。

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    
   }
}

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

@Name("myGuicyComponent")

@Guice("myGuiceInjector")
public class MyGuicyComponent
{
   @Inject MyObject myObject;
   ...
}

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