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
- 作者: Ken Finnigan
- 出版社/メーカー: Packt Publishing
- 発売日: 2013/07/12
- メディア: Kindle版
- この商品を含むブログを見る