黄泳恩
株式会社DTS ネットワーク事業本部所属。Springを利用した業務開発に携わる。

 本稿では,Springを理解するうえで重要となるDIコンテナについて,基本的な部分を解説したいと思います。はじめに,簡単な例を示してDIコンテナを説明します。その後,その例をプログラミング・レベルに落としてDIのメリットを確認します。最後に,具体的なサンプル・コードを使って,DIコンテナを利用する際の実装方法を見ていきます。

DIコンテナとは?

 DIコンテナのDIは,Dependency Injectionの略です。直訳すると“依存性を注入する”コンテナという意味になります。オブジェクト間の依存性をDIコンテナが管理することで,オブジェクト間の疎結合を可能にします。

 少し話を簡単にするために,DIコンテナを身近なものにたとえて説明します。ここに,学生の山田くんと金持ちお嬢様薫子という二人がいます。この二人がそれぞれに“ドライブしたい”と思ったら?という想定です。

 学生の山田くんは,車を持っていないのでお父さんの軽自動車を借りてドライブに出かけます(図1)。

図1●「ドライブしたい」学生の山田くんの場合
図1●「ドライブしたい」学生の山田くんの場合

 一方,お嬢様薫子は,自分のお城で“ドライブがしたいわ~”とつぶやきます。すると,お嬢様薫子に仕えるメイドさんがすかさず車の手配をし,翌日には家の前にリムジンが待っています(図2)。

図2●「ドライブしたい」お嬢様薫子の場合
図2●「ドライブしたい」お嬢様薫子の場合

 学生の山田くんは,自分でなんとかして車を準備しなければなりませんが,お嬢様薫子は,どんな車かはわかりませんが,メイドさんが車を手配してくれるので,自分は何もする必要がありません。この場合に,知らないところで車を用意してくれるメイドさんにあたるのがDIコンテナなのです。

プログラミングにすると?

 この例をプログラム的に考えてみます。自分で車を手配した学生山田くんは,DIコンテナを利用しないケースになります。

図3●DIコンテナを用いない場合のオブジェクトの関係
図3●DIコンテナを用いない場合のオブジェクトの関係

 DIコンテナを用いない場合,オブジェクトの関係は図3のようになります。学生オブジェクト(学生山田くん)は,自分で軽自動車のインスタンス化(車の手配)をしなければなりません。この時点で,学生オブジェクトと軽自動車オブジェクトとの間に直接的な関連が生じます。

 仮に,学生山田くんが軽自動車を借りることができなくなって,友達にセダンを借りる場合,当日の予定に変更が入ることになります。プログラムで言うと,学生クラスのソースコードに,図4のような修正が入ることになります。

図4●セダンを借りるときの変更点
図4●セダンを借りるときの変更点

 今度は,お嬢様薫子の例を見てみましょう。彼女はDIコンテナを用いたケースとなります。

図5●DIコンテナを用いる場合のオブジェクトの関係
図5●DIコンテナを用いる場合のオブジェクトの関係

 DIコンテナを利用する場合,図5のようなオブジェクトの関係になります。お嬢様薫子は,リムジンのインスタンス化(車の手配)をする必要がありません。これは,DIコンテナ(メイドさん)がリムジン・オブジェクトを生成して,お嬢様薫子のcarプロパティにセットするからです。

 しかし,このままでは,車インタフェースにどの車を手配するか,という情報が抜けてしまいます。そこで,SpringではBean定義ファイルというXMLファイルを使用します。Bean定義ファイルは,先ほどの例で言えば,メイドさんのお仕事リストにあたるもので,オブジェクト同士の関連付け,つまり,車インタフェースにどの車を手配するかを指定するものです。

 DIコンテナのメリットは,変更に強いということです。例えば,お嬢様薫子がリムジンをやめて,スポーツカーに変更するケースを考えてみましょう。お嬢様薫子の乗る車がスポーツカーになっても,手配するのはメイドさんなので,お嬢様薫子の予定が変わることはありません。つまり,Bean定義ファイルに変更は必要ですが,お嬢様クラスのソースコードを変更する必要はないのです。