CDI 【Jakarta Contexts and Dependency Injection】
概要
CDI(Jakarta Contexts and Dependency Injection)とは、Java EE 6で追加された機能の一つで、Javaプログラムで依存性注入(DI:Dependency Injection)など実行時の動的な動作の変更を行うことができるようにするもの。クラス間の依存関係の解決などをコード外で行えるようにする。ソースコード中に「@」で始まる特殊な指定(アノテーション)を記述することで、Java EEの実行環境(Webコンテナ)が実行時に動的にインスタンスの生成や破棄、注入などを行う。実行環境には実行プログラムと共に依存関係の指定などを行う設定ファイル「beans.xml」が必要となる。
「コンテキスト」はインスタンスの生成と破棄のタイミング、すなわちインスタンスが有効である期間(スコープ)を指定するもので、アノテーションによる指定で「一回のHTTPリクエストの間のみ有効」「一連のHTTPセッションの継続中は有効」といった指示を行うことができる。
「依存性注入」(DI)はクラス間の依存関係をアノテーションと設定ファイルの指定に基いてコンテナが実行時に解決する機能である。例えば、あるオブジェクトAがオブジェクトBの機能を利用する場合、通常はAの実装コード中でBをインスタンス化する処理を記述する
DIを用いる場合、実行時に設定ファイルを参照して指定されたオブジェクトを使用するよう指示できる。これにより、AとBの関係は固定的でなくなり(疎結合)、Bの代わりにテスト用のTや互換性のあるCを使うといった変更をコードを書き換えずに行うことができるようになる。
また、AOP(アスペクト指向プログラミング)のための要素も取り込まれており、アノテーションにより「インターセプター」(interceptor)と呼ばれる特殊な処理を挿入することができる。これはメソッドの前や後に設定ファイルで指定した処理を実行するもので、ログ記録のように様々な場面に共通して現れる処理をプログラム本体から切り離して実装できるようになる。
JavaにDIやAOPを追加するフレームワークなどはそれまでも存在したが、CDIが標準仕様(JSR 299)となったことで様々な開発環境、実行環境で同じアノテーションや設定ファイルを共通して使用できるようになった。Java EE 7以降では標準で有効に設定されている。