7.8. 代替の Bean
実装が特定のクライアントモジュールまたはデプロイメントシナリオに固有である Bean が代替となります。
デフォルトでは、@Alternative
Bean が無効になります。これらは、beans.xml
ファイルを編集することにより、特定の Bean アーカイブに対して有効になります。ただし、このアクティベーションは、そのアーカイブの Bean に対してのみ適用されます。CDI 1.1 以降、代替の Bean は、@Priority
アノテーションを使用してアプリケーション全体に対して有効にできます。
例: 代替の定義
この代替により、@Synchronous
代替と@Asynchronous
代替を使用して PaymentProcessor
クラスの実装が定義されます。
@Alternative @Synchronous @Asynchronous public class MockPaymentProcessor implements PaymentProcessor { public void process(Payment payment) { ... } }
例: beans.xml
を使用した @Alternative
の有効化
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd"> <alternatives> <class>org.mycompany.mock.MockPaymentProcessor</class> </alternatives> </beans>
選択された代替の宣言
@Priority
アノテーションによって、アプリケーション全体に対して代替を有効にすることができます。代替にはアプリケーションの優先度を割り当てることができます。
-
管理対象 Bean またはセッション Bean の Bean クラスに
@Priority
アノテーションを置く、または -
プロデューサーメソッド、フィールド、またはリソースを宣言する Bean クラスに
@Priority
アノテーションを置く
7.8.1. 代替を用いたインジェクションのオーバーライド
代替の Bean を使用すると、既存の Bean をオーバーライドできます。これらは、同じ役割を満たすクラスをプラグインする方法として考慮できますが、動作が異なります。代替の Bean はデフォルトで無効になります。
このタスクは、代替を指定し、有効にする方法を示しています。
インジェクションのオーバーライド
このタスクでは、プロジェクトに TranslatingWelcome
クラスがすでにあることを前提としています。ただし、これを "mock" TranslatingWelcome
クラスでオーバーライドするとします。これは、実際の Translator
Bean を使用できないテストデプロイメントのケースに該当します。
代替を定義します。
@Alternative @Translating public class MockTranslatingWelcome extends Welcome { public String buildPhrase(string city) { return "Bienvenue à " + city + "!"); } }
置換実装をアクティベートするために、完全修飾クラス名を
META-INF/beans.xml
またはWEB-INF/beans.xml
ファイルに追加します。<beans> <alternatives> <class>com.acme.MockTranslatingWelcome</class> </alternatives> </beans>
元の実装の代わりに代替実装が使用されます。