11.2.4.3. CDI を用いたオブジェクトの Bean へのインジェクト
META-INF/beans.xml
または WEB-INF/Beans.xml
ファイルが含まれている場合、デプロイメント内の各オブジェクトは CDI を使用して注入できます。
@Inject
アノテーションを使用して、Bean の任意の部分にオブジェクトを注入します。クラスのインスタンスを取得するには、bean 内でフィールドに@Inject
アノテーションを付けます。例11.6
TextTranslator
インスタンスをTranslateController
に挿入しますpublic class TranslateController { @Inject TextTranslator textTranslator; ...
注入されたオブジェクトのメソッドを使用する
注入されたオブジェクトのメソッドを直接使用できます。TextTranslator
にメソッドがあると仮定しますtranslate
。例11.7 注入されたオブジェクトのメソッドを使用する
// in TranslateController class public void translate() { translation = textTranslator.translate(inputText); }
Bean のコンストラクターでインジェクションを使用します。
ファクトリーやサービスロケーターを使用して作成する代わりに、Bean のコンストラクターへオブジェクトをインジェクトできます。例11.8 Bean のコンストラクターでインジェクションを使用します。
public class TextTranslator { private SentenceParser sentenceParser; private Translator sentenceTranslator; @Inject TextTranslator(SentenceParser sentenceParser, Translator sentenceTranslator) { this.sentenceParser = sentenceParser; this.sentenceTranslator = sentenceTranslator; } // Methods of the TextTranslator class ... }
Instance(<T>)
インターフェースを使用してインスタンスをプログラムにより取得します。Bean 型でパラメーター化されると、Instance
インターフェースは TextTranslator のインスタンスを返すことができます。例11.9 プログラムでインスタンスを取得する
@Inject Instance<TextTranslator> textTranslatorInstance; ... public void translate() { textTranslatorInstance.get().translate(inputText); }
結果:
オブジェクトを Bean にインジェクトすると、Bean は全オブジェクトのメソッドとプロパティーを使用できるようになります。Bean のコンストラクターにインジェクトするときに、インジェクションがすでに存在するインスタンスを参照する場合以外は、Bean のコンストラクターが呼び出されるとインジェクトされたオブジェクトのインスタンスが作成されます。たとえば、セッションの存続期間内にセッションスコープの Bean をインジェクトしても、新しいインスタンスは作成されません。