■ 役割
* インスタンス管理
■ 概要
DIコンテナを利用する場合、以下のようなオブジェクトの関係になります。 +------------------+ +----------------+ +--------------------+ |クラス(利用する側)| ====> |インターフェイス| <---- |クラス(利用される側)| +------------------+ +----------------+ +--------------------+ 利用する側は、利用される側のインスタンス化を行う必要はない。 その代わり、DIコンテナが生成し、利用する側が予め用意しておいたプロパティにセットする。 しかし、このままでは、インタフェースに、そのインターフェイスを継承したどのクラスを利用するか、抜けている。 通常、そのオブジェクト同士の関連付けは、XML設定ファイルなどで管理し、インタフェースにどのクラスを手配するかを指定する。イメージ
※1:インスタンスを注入
※2:XML設定ファイルなどより、インスタンスを読み取る
+--------+ ※1 +------------+ ※2 +------------------+
| クラス | <==== | DIコンテナ | <===> | 設定ファイルなど |
+--------+ +------------+ +------------------+
}}}
| クラス | <==== | DIコンテナ | <===> | 設定ファイルなど |
+--------+ +------------+ +------------------+
}}}
■ 用語整理
Dependency(依存性)とは?
* クラス間でのオブジェクトの関係している状態
Injection(注入)とは?
* 「外部からの設定(Configuration)」を意味
DIを導入する目的・メリット
* クラス間の依存を排除する => オブジェクト間の疎結合にする。 ※ 疎結合とは、コンポーネント同士の結びつきが比較的緩やかで、独立性が強い状態のこと => そのため、変更に強い * 分業で開発しやすくなる * アプリケーションのコンポーネント(何らかの機能を持ったプログラムの部品)化を促進すること * モックツールを使って、単体テストがとてもやりやすくなる
■ 具体的にソースから理解する
依存性のイメージ
* DIのポイントは、(*)部分の「DAOImplClass」で、 インターフェイス「DAOInterface」をワンクッションおくことにより、 以下の2点が可能となる [1] 別の実装クラスに置き換えることが可能 [2] テスト用クラス(Mockクラス)に置き換えることが可能イメージ
+---------+ 依存 +-------+ 依存 +------------+ 実装 +------------+ |MainClass| ====> |DIClass| ====> |DAOInterface| <|=== |DAOImplClass| => DB +---------+ +-------+ +------------+ +------------+ (*) POINT
■ サンプル
Main.java
public class Main { public static void main (String[] args) { Dao dao = new DaoImpl(); Di di = new Di(dao); String str = di.getString(); System.out.println(str); } }
Di.java
public class Di { private final Dao dao; public Di (Dao dao) { this.dao = dao; } public String getString () { String str = dao.getString(); return String.format("取得した文字:%s\n", str); } }
Dao.java
public interface Dao { public String getString (); }
DaoImpl.java
public class DaoImpl implements Dao { public String getString () { return "DIサンプルです"; } }
参考資料
DIコンテナのイメージ
* なかなか面白い例http://itpro.nikkeibp.co.jp/article/COLUMN/20070718/277686/?ST=develop
DI全般
* 読みやすく勉強になるhttp://d.hatena.ne.jp/daisuke-m/20080510/1210444818