Media Five Co. 夢に近づくためにできることから始めてる。
エンジニアの独り言…
『DIコンテナ』

今回はDIコンテナについて少し触れてみたいと思います。

DIコンテナの DI とは、 Dependency Injection(依存性の注入) の略です。
軽量コンテナとも呼ばれます。


例えば、あるクラス(名前をControllerクラスとします)で、
別のあるクラス(Exampleクラスとします)のインスタンスを取得する場合は、


■Controller.java

Example exa = new Example();

のようなコードを書きます、さらにExampleクラスのメソッドを使用する場合は、

■Controller.java

exa.execute();

と書きます。
当たり前ですがControllerクラスのコード内に、Exampleクラスが出てくることになります。
ということは、ControllerクラスがExampleクラスを知っていなければならなくなります。
これが依存性です。

上記コードにはデメリットがあります。
Controllerクラスの実行・テストを行う際に、Exampleクラスが必要になるということです。
Controllerクラスのテストをしたいのに、他のクラスが必要になるのは何か嫌ですよね。
仮に、Exampleクラス内で、さらに他のクラスが使われていたら、
それらのクラスも用意しなければならなくなります。
さらにいえば、Exampleクラスがデータベースからデータを取得するような
クラスだったとしたら、データベースも用意しなければならなくなります。
大変ですね。


そこで、DIコンテナを使うとオブジェクト間の依存性を断ち切ることができます。
DIコンテナを使うと、上記例でいいますと、ControllerクラスがExampleクラスに
依存する部分をControllerクラスのコード内に直接記述する必要がなくなります。
ではどうするのかといいますと、DIコンテナによって異なりすが、
間接的な方法で、例えばXML形式の設定ファイルにControllerクラスとExampleクラスの
依存性を記述することで実現できます。
※具体的な説明は省かせて頂きます。
この時、Exampleクラスは何らかのinterfaceに対する実装であることが望ましいです。
ここでExampleクラスはIExampleインタフェースを実装したとします。

DIコンテナは、interfaceと実クラスとの関連を管理してくれます。
Controllerクラスから、DIコンテナに対してIExampleを要求すると、
IExampleに関連付けられたクラス、つまりExampleクラスのインスタンスを
取得することができるようになります。
Controllerクラスが意識するのは、IExampleというインタフェースになるので、
Exampleクラスとの依存性がなくなりました。
Controllerクラスのテストも、IExampleインタフェースを
実装したMockクラスを用意すればテストの実行が可能になります。
また、依存性がなくなった為、
変更による影響範囲が小さくなりメンテナンスもしやすくなると思います。



実は、今参画しているプロジェクトでDIコンテナを初めて使ったので、
まだまだ私も勉強中なのですが、実際に使ってみてデメリットは
あまりないように思います。テストなんて本当にやり易いので、
テストをバシバシをやっています。
テストをたくさんやるということは、品質も良くなりますし、
それもDIコンテナのメリットの中の1つだと思います。

Javaエンジニアの方で、まだDIコンテナを使ったことがない方にはお勧めです。
また、Javaの勉強を始めたばかりの方にも、インタフェースなどが
出てきますので、ちょっと調べてみたりするといい勉強になると思います。

Last Update : 2005/08/18
 
Copyright (C) 2004 Media Five Co. - Tech All Rights Reserved.
BACK TOP HOME