#これは何?
Spring Bootを利用する上で、DIをする必要があるなどという単語が行き交いますが、正確にDIを理解することができていないためこれをまとめる。
#そもそもDIとは何ですか?
DIとは依存性の注入(Dependency Injection)を指す。
これだけだとよくわかんないので詳しく記す。
##依存性とは?
依存性とは、Javaにおける依存性を指しているわけだが、その依存性とはなんなんだろう?
より具体的に表すと以下の2つのどちらかに該当する場合に、依存しているということが言える。
- 他のクラスをローカル変数として持っている
- 他のクラスがメソッドの引数、戻り値になっている
バイクを例に解説する。
// バイククラス
public class MotorBike {
private KawasakiEngine; //kawasakiのエンジン
// constructor
public class MotorBike(KawasakiEngin kawasakiEngine){
this.kawasakiEngine = kawasakiEngine;
}
}
このバイククラスはKawasakiのエンジンを使う。このバイクを作る(インスタンス化)する場合のコードは以下のようになる。
public class Main {
public static void main(String[] args){
// パーツの生成
KawasakiEngine kawasakiEngine = new KawasakiEngine();
// バイクの生成
MotorBike motorBike = new MotorBike(kawasakiEngine);
}
}
このようなケースで、バイククラスがKawasakiのエンジンクラスに依存していると言えます。
そして、依存には度合いがあります。
依存度についてはまた別の機会でまとめる。
##注入とは?
1つ1つ生成(new)したインスタンスを、各変数に入れることを注入という。
##依存性の注入(DI)とは?
DIは、上記2つを同時に、かつ簡単に行ってくれることをいう。
###DIの中の処理について
-
DIの管理対象クラスを探す
Springを起動すると、コンポーネントスキャンという処理が走る。これは、DIで管理する対象のアノテーションが付けられているクラスを探す。コンポーネントスキャン対象のアノテーションは以下。これらアノテーションがついているクラスをBeanという。
@Component, @Controller, @Service, @Repository, @Configuration, @RestController, @ControllAdvice, @ManagedBean, @Named -
インスタンスの生成と注入
DIコンテナに登録されたBeanのインスタンス生成と注入を行っている。DI対象のクラス(Bean)を集めた後は、それらのインスタンスをDIが生成(new)する。そして、生成したインスタンスを@Autowiredアノテーションがついているフィールドなどに注入する。
###DIの実装方法
DIの実装方法には、以下の5つがある。
-
アノテーションベース
小規模なアプリケーションを作る場合には、アノテーションベースで十分。 -
JavaConfig
こちらを使うことでより細かい設定をすることができるようになる。
そのため大規模開発になるとNo.4のようにアノテーションベース+JavaConfigを合わせた実装を行うことがある。 -
xml
-
JavaConfig + アノテーション
-
xml + アノテーション
どのように実装するかについては今後記載していく。