DIコンテナは,「DI(Dependency Injection:依存性の注入)」と呼ぶデザインパターンに基づいて作られたコンポーネント群を集中管理するためのソフトウエアです。

 DIは,コンポーネント(クラス)間の依存関係をソースコードから取り除くことで,プログラムの実行時までコンポーネント同士が依存関係を持たないようにするデザインパターンです。

 例えば,あるクラスAの中で別のクラスBのインスタンスを生成して利用しているとき,AはBに強く依存してしまっています。つまり,Bを別のクラスに差し替えたときなどにはAも変更しなければなりません。このような依存関係は,AとBを別の人が作っている場合などに特に困ります。

 こうした依存性をクラスから取り除くのがDIパターンです。Bへの依存性をAから排除するには,まずBの機能を抽象化したインタフェースIを定義し,Iを実装したクラスとしてBを作ります。

 Bのインスタンスを生成するコードはAから削除し,その代わりに「Iを実装したクラスのインスタンス」を外部から与えてもらう形にします。Bの利用を前提に書かれていたコードはすべてIの機能を利用するコードに書き換えます。これでBを利用するコードがAから完全に取り除かれます。

 実行時には誰かがBのインスタンスを生成してIにキャストし,Aに与えます。この操作が「依存性の注入」で,ここで初めてAがBに対して依存性を持つことになります。

 この「誰か」の役目を一手に引き受けるのがDIコンテナです。DIパターンを使って抽出した依存関係は「設定ファイル」として1カ所にまとめて記述できます。DIコンテナは,この設定ファイルに従い,インスタンス化や依存性の注入を処理します。代表的なDIコンテナであるSpring FrameworkやSeasar2は,設定ファイルをXML形式で記述します。

 DIを実現するコードは,Java標準のコンポーネント技術であるEJB(EnterpriseJavaBeans)に比べて圧倒的にシンプルです。このためDIコンテナをEJBコンテナとの対比で「軽量コンテナ」と呼ぶこともあります。また,EJBの次期版であるEJB 3.0ではDIコンテナの機能が導入される予定です。


出典:日経ソフトウエア 2006年7月号 131ページより
記事は執筆時の情報に基づいており、現在では異なる場合があります。