CDI の管理対象範囲


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.xml に bean-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定義アノテーションの範囲は、

  • 全てのノーマルスコープアノテーション(@RequestScoped や @ApplicationScoped, など)
  • 組み込みの @Dependent スコープアノテーション
  • @Interceptor と @Decorator アノテーション
  • ステレオタイプアノテーション


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

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


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

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

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

CDI 2.0

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

beans.xml

beans.xml の配置場所は以下。

packaging 配置場所 gradleの場合
JAR META-INF以下 src/main/resources/META-INF/
EJB META-INF以下 src/main/resources/META-INF/
WAR WEB-INF以下 src/main/webapp/WEB-INF/

beans.xml を用意する場合のテンプレは以下。

CDI 1.0
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>
CDI 1.1
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       version="1.1" bean-discovery-mode="annotated">
</beans>
CDI 1.2

CDI1.2 はメンテナンスリリースなので、スキーマ定義はそのまま

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       version="1.2" bean-discovery-mode="annotated">
</beans>




JBoss Weld CDI for Java Platform

JBoss Weld CDI for Java Platform