実行中のプログラムに「コードを注入する」などと言うと夢物語のように聞こえるかもしれないが,緻密に設計されたフレームワークの上では,DIは既に実現済みの機能である。「Bの生成」に相当する機能を,「A」ではなくフレームワーク側に持たせる。しかも,この依存性を「注入」する機能それ自体は小規模のソフトウエアで実現でき,したがって「軽量級」のフレームワーク(DIコンテナ)となる(図1の(b)[拡大表示])。

 DIを実現するメカニズムの大筋は以下のようになる。

 オブジェクトAがオブジェクトBに依存する部分を,Aのソースコードに直接記述するのではなく,間接的な方法で(メタレベルで)記述する。例えば Spring Frameworkの場合は,XML形式の設定ファイルに,AとBとの間の依存性を記述する。EJB3.0では,Java言語仕様に加わったメタデータにより,アノテーション(「@session」など,プログラム・コード中に挿入する付帯情報)として記述する。

 これにより,AはBに依存するコードを含まないオブジェクトになる。言い換えると,POJO(Plain Old Java Object)になる。依存性がないので,Aは単体でテストでき,問題を発見すれば心ゆくまでデバッグできる。こう書くと普通のやり方に聞こえるかもしれないが,EJBコンポーネントの場合は難しかったのだ。

DIのメリットは広い

 もちろん,DIのメリットは「EJBを軽量化する」だけにとどまらない。DIを使うことで,あらゆるフレームワークの依存性を極小にできる。

 Spring Frameworkの場合は,Webベースのユーザー・インタフェース,データベース・アクセスなど,サーバーサイドのアプリケーションを動かすための機能群が揃っていて,DIの枠組みで利用できるようになっている。DIのメリットにより「組み替え」が容易なので,Web層フレームワークには Struts,データベース・アクセスにはHibernate(オープンソースのO-Rマッピング・フレームワーク)という具合に,他のフレームワークを自在に組み合わせることが可能となる。このさい重要なのは,アプリケーション・プログラムと,これらフレームワークとの依存性が極小になるということである。

 またSeasar2の上で開発中の「S2JSF」は,Web層にDIの考え方を取り入れたフレームワークとして興味深い技術である。最新のWeb層フレームワークJSF(JavaServer Faces)では,画面の記述のためJSFタグを使ったJSP(JavaServer Pages)を使う。ところが,通常の開発工程ではデザイナーが直接JSPを作るのではなく,通常のHTMLファイルによる画面デザインをJSPに変換するという手間がかかっていた。S2JSFでは,HTMLファイルに,JSF実行に必要な情報を後から「注入」することで,HTMLファイルをJSFフレームワークの画面定義に使えるという機能を実現している。

 ここまで読んで下さった読者は,DIをもっと知りたい,あるいは動かしてみたいと感じておられるかもしれない。「日経BP Javaプロジェクト」では,DIコンテナとして実績があるSpring Frameworkの使いこなし方をテーマとして書籍を企画中だ。近いうちに,読者の皆さんに報告できるはずである。

(星 暁雄=日経BP Javaプロジェクト)