【Java】【DI】DI (Dependency Injection, 依存性の注入) ~概念編~

■ 役割

 * インスタンス管理

■ 概要

DIコンテナを利用する場合、以下のようなオブジェクトの関係になります。

+------------------+       +----------------+       +--------------------+ 
|クラス(利用する側)| ====> |インターフェイス| <---- |クラス(利用される側)|
+------------------+       +----------------+       +--------------------+


利用する側は、利用される側のインスタンス化を行う必要はない。
その代わり、DIコンテナが生成し、利用する側が予め用意しておいたプロパティにセットする。

 しかし、このままでは、インタフェースに、そのインターフェイスを継承したどのクラスを利用するか、抜けている。
通常、そのオブジェクト同士の関連付けは、XML設定ファイルなどで管理し、インタフェースにどのクラスを手配するかを指定する。
イメージ
※1:インスタンスを注入
※2:XML設定ファイルなどより、インスタンスを読み取る

+--------+ ※1 +------------+ ※2 +------------------+
| クラス | <==== | 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

StrategyパターンとDIとの絡み

http://blogs.wankuma.com/nagise/archive/2007/08/03/88554.aspx

関連記事

DIコンテナ・サンプル

http://blogs.yahoo.co.jp/dk521123/19734333.html

Strategyパターン

http://blogs.yahoo.co.jp/dk521123/24787700.html