DIコンテナ(依存性の注入)
DIコンテナとは依存性の注入をしてくれるSpring Frameworkの機能
依存とは
クラス依存
クラスAとクラスBがあり、クラスAでクラスBのメソッドを使う場合は以下になる。
class A {
public void methodA() {
B b = new B();
b.methodB();
}
}
上記のようにクラスA(使う側)でクラスB(使われる側)のインスタンスを作成してメソッドを実行する。
仕様変更などで、使われる側のクラスがクラスCになった場合は以下のように修正することになる。
class A {
public void methodA() {
C c = new C();
c.methodC();
}
}
このようにインスタンスを作り直してメソッドを実行した。書き換えた箇所を「依存性がある」という。
Bのインスタンを使用している箇所が10箇所や100箇所あった場合、修正にかなり時間がかかってしまう。
Spring FrameworkのDIコンテナを使えば、修正する箇所は最小限にできる。
DIコンテナを使う
DIコンテナを使えば明示的にインスタンスを生成しなくても、自動的にインスタンスを生成してくれる。
DIコンテナを使う場合はインタフェースを使って依存関係を作る必要があるので、インタフェースを作成する必要がある。以下4つを作成する。
「動物が鳴く」の役割を持ったインタフェース
public interface Cry {
void crying();
}
犬クラス
public class Dog implements Cry {
@Override
public void crying(){
System.out.println("わん");
}
}
猫クラス
猫クラスのインスタンスをDIコンテナで生成することにする。
生成したいクラスに@Componentアノテーションを付与する。
@Component
public class Cat implements Cry {
@Override
public void crying(){
System.out.println("にゃあ");
}
}
使う側クラス
DIコンテナによって生成されたインスタンスを使用するためには、使用したいクラスで参照を受け取る必要がある。参照を受け取るフィールドを宣言し@Autowiredアノテーションを付与する。
猫クラスのインスタンスを受け取るので「にゃあ」と出力される。
public class Main {
// ここでDIコンテナによって生成された、猫クラスのインスタンスを受け取る
@Autowired
Cry cry;
public void execute() {
cry.crying(); //にゃあと出力される
}
}
仕様変更により使われる側クラスを犬クラスに変更する場合は、@Componentアノテーションを猫クラスから犬クラスに付与するだけで良い。
// アノテーション削除
public class Cat implements Cry {
@Override
public void crying(){
System.out.println("にゃあ");
}
}
// アノテーション付与
@Component
public class Dog implements Cry {
@Override
public void crying(){
System.out.println("わん");
}
}
これにより使う側クラスで修正を加えることなく犬クラスに変更することができる。
猫クラスを使う箇所が10箇所や100箇所でもアノテーションを付け替えるだけなので、修正に時間がかからない。
public class Main {
// 今度は犬クラスのインスタンスを受け取る
@Autowired
Cry cry;
public void execute() {
cry.crying(); //わんと出力される
}
}
終わり
Spring Frameworkの勉強を始めたばかりなので、簡単ではありますがDIコンテナ(依存性の注入)について執筆しました