【Jakarta EE 12】Jakarta Contexts and Dependency Injection 5.0 変更点まとめ(2025/12時点)


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 アノテーションを使い、明示的にクローズ処理を書く必要があった。

@AutoClose アノテーションは Bean クラスに付与でき、AutoCloseable インターフェースを実装していれば、Bean の破棄中に AutoCloseable#close() が自動で呼び出される。


BuildCompatibleExtension の手動登録

BuildCompatibleExtension は CDI 4.0 で追加されたビルドタイム指向向けの拡張機能。

CDI 4.0 では、META-INF/services の設定ファイルを介する Service Provider Interface (SPI) により登録する必要があった。

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 に変更された。


非同期 method invokers

CDI 4.1 で追加された method invokers で非同期メソッドの呼び出しが可能となった。

フレームワーク開発者向け


プリミティブ型とラッパー型に対する仕様明確化

監視対象の型と発生したイベントの間にプリミティブ型とラッパー型の組み合わせがある場合の仕様が明確でなかった。

以下のケースでどのメソッドが呼び出されるか。

@Inject
Event<Integer> intEvent;

public void primitiveObserver(@Observes int i) {
}

public void wrapperObserver(@Observes Integer i) {
}

オブザーバーの解決において、java.lang パッケージ内のプリミティブ型とその対応するラッパー型は同一と見なされ、代入可能である。 コンテナは、プリミティブ型のイベントパラメータを宣言するオブザーバーメソッドを呼び出す際にアンボクシングを実行する。

先の例では、両方のオブザーバーに通知されることが明確化された。


コンテキストインスタンスの強制生成を可能

ArCとWeldには、コンテキストインスタンスの強制生成を可能にするAPIが存在するが、CDI仕様では規定されていない。

ArC では ClientProxy.unwrap(Object)、Weld では WeldClientProxy.getMetadata().getContextualInstance()

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);


その他

ref 説明
Remove support for Security Manager remove support for Security Manager CDI4.1(Jakarta EE 11)で対応が漏れていたSecurity Manager依存の削除
Explicitly forbid wildcards in Event/Instance injection points
Forbid injecting Event/Instance with a wildcard type
Weld と Arc(Quarkus) で挙動が異なるワイルドカード型イベントに対する補足仕様追加
add support for sealed classes to the Lang Model ClassInfo に sealed classes 用メソッドを追加
Add slightly more details to the Invoker javadoc InvokerInvokerBuilder の JavaDoc を加筆
Update javadoc of RequestContextController with suggested usage
RequestContextController spec impossible to implement
RequestContextController の JavaDoc を加筆
use the term "bean name" instead of "EL name" in the API JavaDoc の EL name という用語を bean name に置き換え
Updates 最小Javaバージョン 11 → 17。BeanManager から非推奨メソッド削除など
bump to 5.0.0.Alpha2-SNAPSHOT pom.xml 内 artifact の バージョン更新
Provide beans_5_0.xsd for upcoming 5.0
Add beans XSD file for 5.0
CDI 5.0 用に beans_5_0.xsd を追加
Clarify where Alternatives are available for injection
fix the specification of alternatives
Alternative アノテーションの仕様修正
State that vetoing an already specialized bean results in non-portable behavior Portable extensions の ProcessBeanAttributes イベント、veto() メソッドの仕様加筆
add support for synthetic bean injection points Portable Extensions と同等機能を Build Compatible Extensions にも導入
Define how InjectionPoint works when a bean is obtained via CDI.current() CDI.current() 経由で取得した Bean で InjectionPoint がどのように機能するかを明確化