web-dev-qa-db-ja.com

CDI 1.1で注釈が付けられたBeanディスカバリーモードの意味

アプリケーションをJava EE 7に移行していて、CDI 1.1に移行したいのですが、bean-discovery-mode="annotated"の意味がわかりません。 CDI 1.1仕様 =あまり役に立たない。少なくとも有用な段落を見つけていない。

この例はbean-discovery-mode="all"で完全に実行され、LoggingClassのインスタンスを注入します。

public class LoggingClass {
    public Logger logger = Logger.getLogger("ALOGGER");

}

@Test
public class MMLoggerProducerIT extends Arquillian {

    @Inject private LoggingClass lc;

}

ただし、bean-discovery-mode="all"からbean-discovery-mode="annotated"に変更した場合、コンテナはlcフィールドにインスタンスを挿入できません。

bean-discovery-mode="annotated"を正しく使用するには、LoggingClassに注釈を付ける必要がありますか?

26
Oliver

実際問題として、_bean-discovery-mode="ALL"_はアーカイブ内のすべてのクラスのスキャンをオンにします。これは「明示的アーカイブ」と呼ばれます。

_beans.xml_を省略するか、_bean-discovery-mode="ANNOTATED"_を設定すると、アーカイブは暗黙的なアーカイブになります。この場合、コンテナは注釈付きスコープタイプのBeanをスキャンします。

これは、_bean-discovery-mode="ANNOTATED"_を設定したときにLoggingClassが挿入されない理由を説明しています。 Java EE 7チュートリアルに記載されているとおり:

CDIは、暗黙的なアーカイブでスコープタイプの注釈が付けられたBeanのみを管理および注入できます。

編集:したがって、明確にするために、LoggingClassにスコープタイプを追加する必要があります。だからこのようなもの:

_@SessionScoped
public class LoggingClass {
    public Logger logger = Logger.getLogger("ALOGGER");
}
_

Java EE 7およびCDI 1.1では、アーカイブのCDIを有効にする_beans.xml_デプロイメント記述子を含める要件を削除し、CDI 1.1を他のほとんどのJavaに合わせました。 _デプロイメント記述子がオプションであるEE API。また、_beans.xml_を含めるかどうかのバイナリのオン/オフの性質を削除しました。 _bean-discovery-mode_の設定を使用して、コンテナによってスキャンされるファイルを制御できます。

CDIアプリケーションのパッケージ化に関するJavaEEチュートリアルを参照してください: http://docs.Oracle.com/javaee/7/tutorial/cdi-adv001.htm#CACDCFDE

34
Ian Evans

bean-discovery-mode="annotated"を使用する場合、注釈を定義するbeanを持つクラスのみ発見される 。他のすべてのクラスは無視されます。 スコープタイプは、Bean定義アノテーションです。スコープタイプがBeanクラスで宣言されている場合、そのBeanクラスには、annotation[spec]を定義するBeanがあると言われます。ここでは1.1仕様が完全に明確ではありません。 @NormalScopeスコープまたは@Dependent疑似スコープを持つクラスのみが検出され、@javax.inject.Singletonおよび他のすべての@Scope(疑似)スコープ 無視されます

「Bean定義アノテーション」の定義はCDI 1.2で変更され、現在非常によく定義されていることに注意してください。

注釈を定義するBeanのセットには以下が含まれます。

  • @ ApplicationScoped、@ SessionScoped、@ ConversationScopedおよび@RequestScopedアノテーション、
  • 他のすべての通常のスコープタイプ、
  • @Interceptorおよび@Decoratorアノテーション、
  • すべてのステレオタイプアノテーション(つまり、@ Stereotypeアノテーションが付けられたアノテーション)、および@Dependentスコープアノテーション。
39
rmuller

また、@ rmullerの回答フォームにも同意します。しかし、アプリケーションサーバーPayaraとWildflyにはまだ異なる動作があることを指摘したいと思います。通常のスコープではないクラスで@EJBインジェクションを使用する次の例を参照してください。

public class SomeClass  {
    @EJB
    MyService myService;

   ...
}

Beans.xmlファイルに以下を提供する場合:

 .... version="1.2" bean-discovery-mode="annotated"....

Payara 4.1は、クラスをCDI BeanとしてSomeClass NOTとして扱い、サービスEJBを注入しません。これは、仕様に記載されているとおりに動作することは明らかです。

ただし、Wildfly 10はクラスをCDI Beanとして扱い、予期しないサービスEJBを注入します。これを機能させるには、beans.xmlファイルは次のようになります。

 .... version="1.2" bean-discovery-mode="all"....

ここで、最も一般的な2つのアプリケーションサーバーの動作が異なるのは驚くべきことです。

2
Ralph