アプリケーションを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
に注釈を付ける必要がありますか?
実際問題として、_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
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スコープアノテーション。
また、@ 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つのアプリケーションサーバーの動作が異なるのは驚くべきことです。