31

アプリケーションを 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

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

4

3 に答える 3

39

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

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

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

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

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

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

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

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

于 2013-08-19T21:33:36.580 に答える