デプロイメントタイプ

デプロイメントタイプとは、「コンテナにデプロイされるコンポーネントのタイプを一括して設定できる仕組み」と言える。どういうことかと言うと、たとえば実際に動くコンポーネントとモックの2種類が存在したとして、ユニットテスト時はコンポーネントのモックを使用したい、といった場合だ。Web Beansを使えば、やはりアノテーションでこうした設定を行うことができる。

まずは、デプロイメントタイプの作成方法を見てみよう。@DeploymentTypeを指定したアノテーションを作成するだけだ。

リスト33

    @DeploymentType
    @Retention(RUNTIME)
    @Target({TYPE, METHOD})
    public @interface Mock {
    }

あとは、このデプロイメントタイプをコンポーネントに付与すればよい。

リスト34

    @Mock
    @Component
    public class MockGreetingPrinter extends GreetingPrinter {
      public void print(String name) {
        System.out.println("こんちは" + name);
      }
    }

これまで挙げたコンポーネントのサンプルでは、デプロイメントタイプの明示的な指定は行っていない。省略すると、デフォルトでは@Productionとなる。

こうして、同じAPIの型を持つ複数のコンポーネントを、異なるデプロイメントタイプで作成した後は、web-beans.xmlを用いて「どのデプロイメントタイプを優先するか」を指定することができる。

リスト35

    <component-types>
      <component-type>javax.webbeans.Standard</component-type>
      <component-type>javax.webbeans.Production</component-type>
      <component-type>examples.Mock</component-type>
    </component-types>

<component-type>の順序が重要で、下にあるものほど優先度が高くなる。この例では、@Mockが指定されているコンポーネント (MockGreetingPrinter) が、@Productionのコンポーネント (GreetingPrinter) よりも優先されるということだ。つまり、GreetingPrinterクラスがコンポーネントとなることはない。