
- tl;dr
- @Eager アノテーション
- @Reserve アノテーション
- @AutoClose アノテーション追加
- BuildCompatibleExtension の手動登録
- MavenグループID/アーティファクトID 変更
- 非同期 method invokers
- プリミティブ型とラッパー型に対する仕様明確化
- コンテキストインスタンスの強制生成を可能
- その他
tl;dr
- EJB の
@Startupに相当する@Eagerアノテーションの追加 @Reserveによる いわゆるデフォルトBeanの指定@AutoCloseによるAutoCloseableを実装するBeanの自動クローズSeContainerInitializer.addBuildCompatibleExtensions()の追加によるBuildCompatibleExtensionの手動登録- Security Manager 依存削除
- 最小Javaバージョン 11 → 17
@Eager アノテーション
Make CDI to replace EJB は、EJB に有る @Startup と @Schedule に相当する機能を CDI に追加したいという issue。
@Schedule については、CDI 4.1 で追加された method invokers を Jakarta Concurrency 側から呼び出すのが妥当ということで、CDI 5.0 の仕様には入らず。
@Startup 相当は以下のように @Observes を介して同等の機能を実現できる。
@ApplicationScoped public class ObservingBean { public void startup(@Observes Startup startup) { } public void initAppScope(@Observes @Initialized(ApplicationScoped.class) Object init) { } }
CDI 5.0 では、上記回避策とは別に、@Eager アノテーションが追加されることになった。
@ApplicationScoped な Bean に @Eager アノテーションを付与することで、Startup イベントの発生と同時にインスタンス生成できる。
@Reserve アノテーション
Quarkus(ArC) の @DefaultBean に相当するものが @Reserve アノテーションとして追加された。
ユーザ側で独自に Bean を定義しない場合に、ライブラリ側の提供するデフォルトの Bean が供給されるもの。
Default という名前が使えず、多くの議論の後に @Reserve という名称となった。
@AutoClose アノテーション追加
Spring では、AutoCloseable を実装する Bean は自動クローズが行われる。
CDI では、@PreDestroy メソッドや @Disposes アノテーションを使い、明示的にクローズ処理を書く必要があった。
- Issue : AutoCloseable beans
- PR: add @AutoClose
@AutoClose アノテーションは Bean クラスに付与でき、AutoCloseable インターフェースを実装していれば、Bean の破棄中に AutoCloseable#close() が自動で呼び出される。
BuildCompatibleExtension の手動登録
BuildCompatibleExtension は CDI 4.0 で追加されたビルドタイム指向向けの拡張機能。
CDI 4.0 では、META-INF/services の設定ファイルを介する Service Provider Interface (SPI) により登録する必要があった。
- Issue : Add the ability to register BuildCompatibleExtension in CDI SE without discovery
- PR: Allow registering BCE in CDI SE without discovery
SeContainerInitializer に以下のメソッドが追加され、手動で BuildCompatibleExtension を登録可能となった。
public abstract class SeContainerInitializer { public abstract SeContainerInitializer addBuildCompatibleExtensions( Class<? extends BuildCompatibleExtension>... extensions); }
MavenグループID/アーティファクトID 変更
CDI はMavenグループID/アーティファクトID に jakarta.enterprise:jakarta.enterprise.cdi-api のような形式を使用している。
他の仕様は jakarta.[spec name]:jakarta.[spec name]-api という形式となっているため、jakarta.cdi:jakarta.cdi-api に変更された。
- Issue : Make Maven coordinates consistent with rest of EE
- PR: Change GAV of CDI artifacts, provide relocation POMs for easier migration
非同期 method invokers
CDI 4.1 で追加された method invokers で非同期メソッドの呼び出しが可能となった。
フレームワーク開発者向け
プリミティブ型とラッパー型に対する仕様明確化
監視対象の型と発生したイベントの間にプリミティブ型とラッパー型の組み合わせがある場合の仕様が明確でなかった。
以下のケースでどのメソッドが呼び出されるか。
@Inject Event<Integer> intEvent; public void primitiveObserver(@Observes int i) { } public void wrapperObserver(@Observes Integer i) { }
- Issue : Clarify observability for primitive types
- PR : specify that an event parameter of an observer method may have a primitive type
オブザーバーの解決において、
java.langパッケージ内のプリミティブ型とその対応するラッパー型は同一と見なされ、代入可能である。 コンテナは、プリミティブ型のイベントパラメータを宣言するオブザーバーメソッドを呼び出す際にアンボクシングを実行する。
先の例では、両方のオブザーバーに通知されることが明確化された。
コンテキストインスタンスの強制生成を可能
ArCとWeldには、コンテキストインスタンスの強制生成を可能にするAPIが存在するが、CDI仕様では規定されていない。
ArC では ClientProxy.unwrap(Object)、Weld では WeldClientProxy.getMetadata().getContextualInstance()
- Issue : provide API to force-create a contextual instance given a client proxy
- PR : Provide a BeanContainer method to unwrap proxies
BeanContainer に以下のメソッドが追加された。
/** * If the given {@code reference} is a client proxy for a bean, returns the contextual instance of the bean. * Otherwise, including when {@code reference} is {@code null}, returns {@code reference} itself. * <p> * If the bean's scope is not active, this method rethrows the {@code ContextNotActiveException} * or {@code IllegalStateException}. * * @param reference the client proxy to unwrap */ <T> T unwrapClientProxy(T reference);