感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

Spring FrameworkのDependency Injection(依存性の注入)ってなに?

<スポンサーリンク>

クラスAとクラスBがあるとする。
クラスAの中でクラスBを使う場合、AはBに依存しているという。
逆にBはAに依存されているという。

public class A {
	public void someMethod() {
		B b = StaticBFactory.getInstance(); // new B();でもいい 
		b.anyMethod();
	}
}

Bを使うためには、AはBのインスタンスを取得しなければならない。
そのためには、Factoryパターンを使ったり、newでインスタンス化などする。

Dependency injectionというのは、このようなオブジェクトの生成を解決し、必要とする依存性を注入することだ。
Springの本を読むと、この「依存性注入」という言葉はほぼ必ず一番初めに説明される。
Springの最もCoreな機能がDependency Injectionなのだ。

Spring FrameworkなどのDIフレームワークでは、AとBのインスタンスをフレームワークが生成して、BをAに注入してくれる。
「挟み込む」と言ってもいいかもしれない。

DIを使えば・・・・以下のように、

public class A {
	private B b:
	public void someMethod() {
		//newとかFactoryがない!
		b.anyMethod();
	}
	public void setB(B b) {
		this.b = b;
	}
}

newとかFactory.getInstance()とかやらなくても、Bのメソッドが使えるようになるのだ。
セッターインジェクションだけじゃなく、

public A(B b) {
	this.b = b;
}

みたいに、コンストラクタインジェクションも可能。

Springでは、IoC(Inversion of Control:制御の反転)コンテナを提供することで、統一的な依存関係の管理方法を提供してくれている。

セッターインジェクション、コンストラクタインジェクションの他に、Spring2.5からは@AutowiredというアノテーションでDIの制御が可能になった。

Spring ContainerがどうやってDIを実現しているかというと、JavaのReflection APIを使っている。
リフレクションの仕組みを使って、オブジェクトを生成、挿入しているのだ。

DIの仕組みを図にするとこんなイメージになる。
f:id:sho322:20140428141705j:plain