« Dependency Injectionとは、なにか | メイン | アプリケーションのESA準拠レベル"5"とは »

DI Everywhere

DIというのは、DIコンテナ(軽量コンテナ)以外でも使えるよという話を先日のエントリDependency Injectionとは、なにかで書いたの。今日スタートした日経BP 星さんのBlog「星暁雄 × Java」でDIネタを発見したので、お祝いトラックバックがてらに、知っているものを書いてみる。

EJB 3.0でDI
星暁雄 × Java」のEJB3.0 Spec LeadのLinda G. DeMichielさんに会ったより。

DIは「アーキテクチャのために使うテクニック」だとLindaさんはコメントしてくれた。EJB3.0では,JNDIのルックアップにDIを適用することでプログラミングがシンプルになっているのだが,このような「どこに,どのようにDIを使うか」を決定する作業は,プログラマというよりアーキテクトの仕事になる,という訳である。

DIは、FactoryパターンにInjectionという+αをつけたようなものだから、JNDIで利用するというのは非常に正しい方法だ。EJB3.0では、J2SE5.0のアノテーション(@をつけたキーワードみたいな)を使い、POJOに機能を足す。JNDI経由のDIとは、@Injectのアノテーションのことだろう(そのままな名前ですが)。

GeronimoでDI
また、以前、JavaWorldへの記事向けにApache Geronimoを調べたときも、結構面白かった。Geronimoは、様々なオープンソースプロダクトとをまとめてあげてJ2EEサーバを提供しようとしている。そのため、各プロダクトを、いかにGeronimoに簡単に載せられるようにするのかがポイントになる。そこで、JMX(JSR77)のMBeanに似たGBeanアーキテクチャというものを提供している。GBeanは、プロダクトごとに作られるもので、設定ファイルによってGeronimo上にロードされる。そして、GBeanで、Geronimoのライフサイクルを監視できるので、それにあわせて、GBeanからプロダクトの起動、停止、設定を行う。こうすることで、既存のプロダクトのコードを一切いじらずに、Geronimoにプラグインが出来るのだ。
で、このGBeanのロードがDIになっている。ロードしたGBean同士も参照できるし、Geronimoの設定も参照できる。あとは、プロダクトの設定も、GeronimoのDI設定から、GBeanを経由してプロダクトに伝えられる。DIにすることで、GBeanの利用範囲をとても大きくしたのだ。
ちなみに、Geronimo自身は、アプリケーションサーバの基本機能として、起動、停止、監視、リソース、GBeanの依存関係などを管理している。
つまり、Geronimoは、JMX+DIによって、アプリケーションコンポーネントのための、コンテナを実現しているのだ。

BPMでDI
さらに、Apche Incubatorで、孵化中のBPM(Business Process Management)エンジン「Agila」においてもDIの話題がある。BPMは、ご存知の通り、ビジネスプロセスを設定ファイル化するものだ。Agilaの場合は、まだ、機能が未成熟なので、ノードと呼ばれるJavaクラスを、パラメタを引き継ぎながら呼び出すというだけだ。そして、BPMエンジンが、そのノードを呼び出すときにDIするというアイデア。パラメタの受け渡しや、プロセス内のほかのノードを参照するのに使えるだろう。ただ、これは、メーリングリストで流れただけなので、まだ実装はされていない(と、思う)。

StrutsでDI
StrutsにDI機能はない。しかし、Spring Frameworkには、Struts対応の機能がある。1つ目は、aplication-contextを使うもの。2つ目が面白くて、sturts-config.xmlを、そのままDIの設定ファイルとして利用するものだ。ただし、Injectするものの設定は、Spring側の設定ファイルで記述するため、2重管理になってしまう。だが、これとてSturtsがネイティブでDI機能を持てばよいだけの話だ。実装も難しい話ではない。struts-config.xmlの拡張範囲内で対応可能ではないだろうか(ていうか、誰かプラグインで作っていてもおかしくない)。


まとめ
こう考えてみると、アーキテクチャにおいて、なにかを呼び出すところで、必ずDIは利用できる。なので、軽量コンテナがDIだけじゃないよという話を書いたわけである。これから出てくるフレームワークは、すべからくDI機能を実装するのではないかという気さえしてくる。また、DIコンテナプロダクトの中にも、組み込みを前提としたものがある。
DIにすれば、プラグインの自由度はぐっと高まるため(設定ファイルは面倒だけど)、応用範囲も広い。いろいろなアイデアが触発される可能性がある。ただ、乱立しては、設定ファイル地獄がさらに深まるだけな気もすれど。どうなることやら。

トラックバック

このエントリーのトラックバックURL:
http://www.arclamp.jp/mt33/mt-tracback.cgi/1415

コメント (2)

トラックバックしていただいた星です。DIの適用領域について,印象ではなくて事実の積み上げから書いていただいて,参考になりました。

arclamp.jpのyusukeです。星さん、コメントありがとうございます。DIコンテナに限らず、なにかの設定によってアプリケーションを組み上げるという手法は、たくさん事例があるはずです。新しい視点で整理してみれば、なにか面白いものが見つかるかもしれないですね。
これからも、よろしくお願いします。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

2005年03月09日 22:24に投稿されたエントリーのページです。

ひとつ前の投稿は「Dependency Injectionとは、なにか」です。

次の投稿は「アプリケーションのESA準拠レベル"5"とは」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Creative Commons License
このブログは、次のライセンスで保護されています。 クリエイティブ・コモンズ・ライセンス.
Powered by
Movable Type