第 7 章 JAKARTA CONTEXTS AND DEPENDENCY INJECTION
7.2. CONTEXTS AND DEPENDENCY INJECTION を使用したアプリケー ションの開発
7.2.2. スキャンプロセスからの Bean の除外
@Dependent
public class BookShop extends Business
implements Shop<Book> { ...
}
1 2
除外フィルターは、Bean アーカイブの beans.xml ファイルの <exclude> 要素によって <scan> 要素 の子として定義されます。デフォルトでは、除外フィルターはアクティブです。定義に以下のものが含 まれる場合、除外フィルターは非アクティブになります。
name 属性を含む、<if-class-available> という名前の子要素。 Bean アーカイブのクラスロー ダーはこの名前のクラスをロードできません。
name 属性を含む、<if-class-not-available> という名前の子要素。 Bean アーカイブのクラス ローダーはこの名前のクラスをロードできます。
name 属性を含む、<if-system-property> という名前の子要素。この名前に対して定義された システムプロパティーはありません。
name 属性と値属性を含む、<if-system-property> という名前の子要素。この名前とこの値に 対して定義されたシステムプロパティーはありません。
フィルターがアクティブな場合、タイプは検出から除外され、以下のいずれかの状態になります。
検出されるタイプの完全修飾名が、除外フィルターの名前属性の値に一致します。
検出されるタイプのパッケージ名が、除外フィルターの接尾辞 ".*" を含む名前属性の値に一致 します。
検出されるタイプのパッケージ名が、除外フィルターの接尾辞 ".*" を含む名前属性の値で始ま ります。
例
例7.1 例例: beans.xml ファイルファイル
最初の除外フィルターにより、com.acme.rest パッケージ内のすべてのクラスが除外されま す。
2 番目の除外フィルターにより、com.acme.faces パッケージとすべてのサブパッケージ内の すべてのクラスが除外されます (Jakarta Server Faces が利用可能でない場合のみ)。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee">
<scan>
<exclude name="com.acme.rest.*" /> 1 <exclude name="com.acme.faces.**"> 2
<if-class-not-available name="javax.faces.context.FacesContext"/>
</exclude>
<exclude name="com.acme.verbose.*"> 3
<if-system-property name="verbosity" value="low"/>
</exclude>
<exclude name="com.acme.ejb.**"> 4
<if-class-available name="javax.enterprise.inject.Model"/>
<if-system-property name="exclude-ejbs"/>
</exclude>
</scan>
</beans>
3 4
3 番目の除外フィルターにより、システムプロパティー verbosity が値 low を持つ場合 に、com.acme.verbose パッケージ内のすべてのクラスが除外されます。
4 番目の除外フィルターにより、システムプロパティー exclude-ejbs が任意の値で設定さ れ、javax.enterprise.inject.Model クラスがクラスローダーでも利用可能な場合
に、com.acme.ejb パッケージとすべてのサブパッケージ内のすべてのクラスが除外されま
す。
注記 注記
Jakarta EE コンポーネントに @Vetoed アノテーションを付けて Java EE コンポーネン
トが Bean と見なされないようにすることができます。イベントは @Vetoed アノテー
ションが付けられたタイプに対して実行されず、また @Vetoed アノテーションが付け られたパッケージでは実行されません。詳細は「@Vetoed」を参照してください。
7.2.3. インジェクションを使用した実装の拡張
インジェクションを使用して、既存のコードの機能を追加または変更できます。
この例では、既存のクラスに翻訳機能を追加します。こメソッド buildPhrase を持つ Welcome クラス がすでにあることを前提とします。buildPhrase メソッドは、都市の名前を引数として取得し、
「Welcome to Boston!」などのフレーズを出力します。
この例では、想像上の Translator オブジェクトが Welcome クラスにインジェクトされま
す。Translator オブジェクトは、文をある言語から別の言語に翻訳できる Enterprise Java Bean ステー
トレス Bean または別のタイプの Bean になります。この例では、Translator は挨拶全体を翻訳するた
めに使用され、元の Welcome クラスは変更されません。Translator は、buildPhrase メソッドが呼び 出される前にインジェクトされます。
例
例
: Translator beanの の
Welcomeクラスへのインジェクト クラスへのインジェクト
7.3. あいまいな依存関係または満たされていない依存関係
コンテナーが 1 つの Bean への注入を解決できない場合、依存関係があいまいとなります。
コンテナーがいずれの Bean に対しても注入の解決をできない場合、依存関係が満たされなくなりま す。
コンテナーは以下の手順を踏み、依存関係の解決をはかります。
1. インジェクションポイントの Bean 型を実装する全 Bean にある修飾子アノテーションを解決し ます。
public class TranslatingWelcome extends Welcome {
@Inject Translator translator;
public String buildPhrase(String city) {
return translator.translate("Welcome to " + city + "!");
} ...
}
2. 無効となっている Bean をフィルタリングします。無効な Bean とは、明示的に有効化されてい ない @Alternative Bean のことです。
依存関係があいまいな場合、あるいは満たされない場合は、コンテナーはデプロイメントを中断して例 外を発生させます。
あいまいな依存関係を修正するには、「修飾子を使用したあいまいなインジェクションの解決」を参照 してください。