デプロイメントタイプ
デプロイメントタイプとは、「コンテナにデプロイされるコンポーネントのタイプを一括して設定できる仕組み」と言える。どういうことかと言うと、たとえば実際に動くコンポーネントとモックの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クラスがコンポーネントとなることはない。