Jakarta EE 10でのCDI
Jakarta CDI 4.0
レッドハット株式会社
2022.09.16
スペシャリストソリューションアーキテクト
瀬戸 智
1
JakartaOne Livestream – Japan 2022
CDIとは
2
3
▸ オブジェクトの生成をDIコンテナ(アプリケーションサーバー)に任せることで、プ
ログラムを疎結合にする。
▸ テストをしやすくなる、プログラムの修正をしやすくなる等の効果が見込まれ
る。
DI:Dependency Injection(依存性の注入)とは
4
▸ Jakarta EE Context And Dependency Injection
▸ Jakarta EEで標準化されたDIの仕組み
▸ Context(=スコープ)を持つのが特徴
CDIとは
5
CDIの例 CDIのアノテーション(ApplicationScoped)を
付けてクラスを定義する。
CDIのアノテーション(Inject)を付けるとオ
ブジェクトが使えるようになる。
(new演算子を使う必要はない )
6
▸ CDIコンテナはアプリケーションの実行時にアノテーションを
走査して依存性解決をする。
・ いわゆる動的DI
CDIの依存性解決のタイミング(4.0より前の場合)
CDI Lite
7
8
画像は
https://www.theserverside.com/blog/Coffee-Talk-Java-News-Stories-and-Opinions/CDI-Full-vs-CDI-Lite-What-changed-in-Contexts-and-Dependency-Injection-40
▸ Quarkusをベースに検討されたCDIのサブセット
・ いくつかの仕様が削られている
▸ MicroProfile+コンパイル時DI向けに策定
▸ 既存のCDI仕様はCDI Fullと呼ばれることに
CDI Lite仕様の新設
9
▸ Red Hatが出しているMicroProfileの実装
▸ WildFly、EAPに比べると高速で起動、動作することが特徴
・ その分機能は少ない(拡張機能を追加することは可能)
Quarkusとは
10
▸ Javaのネイティブコンパイルの仕組み
GraalVMとは
11
https://quarkus.io/
Quarkus + GraalVMのパフォーマンス
12
▸ 〇実行時のメモリ使用量が削減できる
▸ 〇起動時間が早い
▸ ×コンパイルに時間がかかる
▸ ×スループットはごくわずかに落ちる
▸ ×リフレクションに弱い
・ リフレクションを使う場合は追加設定が必要
JVMと比べた場合のGraalVMの特徴
13
▸ CDIは実行時に動的にオブジェクトを生成するためリフレクションを多用してい
る。
▸ MicroProfile(主にQuarkus)はGraalVMを使って高速化を行いたいが、
GraalVMのために設定が増えるのはよろしくない。
CDI仕様とGraalVMの相性の悪さ
14
▸ アプリケーションサーバーの起動時にアノテーションを走査して依存関係が正
しいかを確認していたのが、コンパイル時に依存性解決を行ってもよいことに
なった。 ※実装依存
・ アプリケーションの実行時のDI=動的DI
・ Java等ではこちらが主流
・ コンパイル時のDI=静的DI
・ Scala等ではこちらが主流
CDIの依存性解決のタイミングの変更(追加)
15
▸ いくつかの仕様が削られてます。
・ コンパイル時DIは実行時DIに比べると制約が多い
・ コンパイル時に実行されるすべてのクラスが必要になる等
▸ MicroProfile+コンパイル時DI向け
・ Jakarta EEサーバーではCDI Full(CDIの全機能)が利用できる。
CDI Lite仕様の注意
16
▸ @SessionScoped、@ConversationScoped
・ MicroProfile実装ではセッションが使えないものもある
▸ Decolator
▸ スペシャライゼーション(特殊化)
▸ ポータブルエクステンション
▸ BeanManagerのいくつかのAPI
▸ その他、細かいものが多数・・・・
CDI FullにあってCDI Liteにない仕様(抜粋)
17
CDI Liteの仕様はQuarkusの実装(Arc)をもとに検討されているので、
大雑把にはQuarkusのドキュメントを読むと良いです。
・コンテキストと依存性インジェクション
https://ja.quarkus.io/guides/cdi-reference#supported_features
https://ja.quarkus.io/guides/cdi-reference#limitations
CDI FullにあってCDI Liteにない仕様(抜粋)
18
▸ Jakarta EEの仕様は実装しなければいけない仕様しか記載されていないた
め、CDI Liteは最低限実装しつつCDI Fullの機能も一部使える状況が考えら
れる。
・ どこまで使えるかは実装に依存する。
・ すでにQuarkusでもCDI Liteと差異がある。
CDI Liteを使う場合の注意
19
▸ Jakarta EEサーバーはCDI Fullサポートが必須のため、Liteの注意点を考
慮する必要はない。
・ 全機能が使える。
CDI Fullを使う場合の注意
CDI 変更点
20
21
▸ 非推奨(deprecated)のAPIの削除
▸ bean.xmlでbean-discovery-mode=”annotated” がデフォルトに
・ CDI2.0(EE8)までの複雑怪奇なルールが削除
CDIの非互換(抜粋)
22
▸ CDI組み込みのStartup、Shutdownイベントのイベントリスナーが追加
・ コンパイル時DI(+GraalVM)の場合、beanの初期化処理をコンパイル時
DIで行えるため
▸ ポータブル拡張機能の追加。
・ リフレクションを使用しないCDI機能拡張の方法の提供
▸ ステレオタイプに@Priorityを混ぜ込むことが可能に。
・ テスト用の@Mockとかを定義して入れておくと便利
CDIの追加機能(抜粋)
23
▸ Jakarta EE Spec
https://jakarta.ee/specifications/cdi/4.0/jakarta-cdi-spec-4.0.html
▸ CDI Full vs CDI Lite: What's new in Contexts and Dependency Injection 4.0
https://www.theserverside.com/blog/Coffee-Talk-Java-News-Stories-and-Opinions/CDI-Full-vs-CDI-Lit
e-What-changed-in-Contexts-and-Dependency-Injection-40
▸ Weld Documentation(CDIのRI)
https://weld.cdi-spec.org/documentation/
▸ ja.quarkus.io
https://quarkus.io/
参考資料
linkedin.com/company/red-hat
youtube.com/user/RedHatVideos
facebook.com/redhatinc
twitter.com/RedHat
Red Hat is the world’s leading provider of enterprise
open source software solutions. Award-winning
support, training, and consulting services make
Red Hat a trusted adviser to the Fortune 500.
Thank you
24
25
MVC欲しいとか
gRPCはやくくれとか
リリース頻度上げてほしいとか
アンケートのお願い

Jakarta CDI 4.0