読者です 読者をやめる 読者になる 読者になる

CDI の管理対象範囲

Java JavaEE

CDI 1.0 から CDI 1.2 の間で揺れた CDI 管理対象として扱う範囲の変更について。

CDI 2.0 がそろそろだけど、昔のメモを記念に。。


CDIのバージョン

各種仕様などのバージョン対応。

Ver 対応JSR 対応JavaEE 対応Weld 主な変更
CDI 1.0 JSR-299 JavaEE6 Weld 1.0 Seam が出目となり標準化
CDI 1.1 JSR-346 JavaEE7 Weld 2.0 CDIのデフォルト有効化(GlassFish4.0〜)
CDI 1.2 JSR-346 JavaEE7 Weld 2.2 CDI 1.1のメンテナンスリリース(GlassFish4.1〜)
CDI 2.0 JSR-365 JavaEE8 Weld 3.0 Java SE 向けサポート、JavaEE連携強化


CDI 1.0 の管理対象

beans.xml (空でも可)が有れば CDI が有効、無ければ無効。

CDI の Beans 形式のクラスであればスコープアノテーションなど無くとも全て対象となる。

CDI 1.1 の管理対象

beans.xml が無くてもデフォルトで CDI が有効。 これに合わせて beans.xmlbean-discovery-mode [all|annotated|none]CDI対象範囲の指定が追加された。

mode 説明
all 全てのクラスがCDI対象(CDI1.0でbeans.xmlが有る場合と同じ)
annotated Bean定義アノテーションが付いたクラスかセッションBeanのみCDI対象
none 対象のアーカイブはCDI対象外(CDI1.0でbeans.xmlが無い場合と同じ)


デフォルトは annotated で beans.xml が無い場合は Bean定義アノテーションが付いたクラスかセッションBeanのみがCDI対象になる。

Bean定義アノテーションbean defining annotation とは全てのスコープアノテーション@Dependent とか @RequestScoped とかとされていた。

CDI 1.2 の管理対象

beans.xml が無くてもデフォルトで CDI が有効な点は変わらず。

ただし JSR-330 との互換性確保のため、デフォルトで CDI 対象となる Bean の対象範囲が変更になった。 Bean定義アノテーションの定義範囲が変更になったと言ったほうが正しいかもしれない。


Bean定義アノテーションの範囲は、


簡略化して分かりやすく書くと、デフォルトでCDIの対象となるのは、

  • @RequestScoped@ConversationScoped@SessionScoped@ApplicationScoped@Dependent が付いたクラス
  • @Interceptor または @Decorator が付いたクラス
  • @Stereotype を持つアノテーションが付いたクラス


正確に書くと、@Dependent を除く全ての擬似スコープ(pseudo-scope)アノテーションがデフォルトで無効化された となる。

ノーマルスコープとは、@NormalScope を持つアノテーションで、擬似スコープとは @Scope を持つアノテーションなので、 @Scope が付いた javax.inject.SingletonCDI対象のデフォルトから外されたことになる(ただし@Dependentを除く)。

加えて言うと、@Stereotype を持つ擬似スコープアノテーションが付いたクラスはCDI対象となる。

CDI 2.0

今のところは CDI 1.2 から変更なし。




JBoss Weld CDI for Java Platform

JBoss Weld CDI for Java Platform