SpringBootのDIとは
・Springのコア機能である。
・クラスの外から依存性(オブジェクト)を注入することで、クラス間の依存関係を解消する
ことが目的である。
・インスタンスの生成※1とインスタンスのライフサイクルの管理※2を実施してくれる。
※1インスタンスを毎回生成してアプリに渡すのか、1回のみ生成してアプリに渡すのかを
管理してくれる。
※2サーブレットの各スコープ(セッションスコープなど)にインスタンスを簡単に登録して
スコープの有効期限が切れたらインスタンスを破棄してくれる。
DIの実装方法
以下のパターンがある。
・アノテーションベース
・JavaConfig
・xml
・JavaConfig + アノテーション
・xml + アノテーション
アノテーションベースの方が簡単にアプリケーションを作成できるが、JavaConfigだとインスタンスを
生成する際にコンストラクタに渡す値を設定したりというような細かい設定が可能となる
また、本番環境と開発環境でJavaConfigを切替えたるといった細かい切り替えが可能となる
小規模なアプリであればアノテーションベースで作成して、細かい設定などをしたいインスタンスがある場合に、そのインスタンスのみJavaConfigで設定するという方法が望ましい。
xmlでは、JavaConfigと同じ内容をxmlの形式で行う。
DIの中の処理
- Springを起動すると、DIコンテナ上で管理するクラスを探す処理(コンポーネントスキャナン)が走る。
- DIが管理対象のクラスを見つけた後は、それらのインスタンスを生成して@Autowiredアノテーションがついているフィールドにセットする。
※DIコンテナ上で管理するクラスをBeanという。
・DIコンテナにクラスを登録する方法(アノテーションの場合)
@Component、@Controller、@Service、@Repositoryなどのアノテーションがついている
クラスが対象である。
・DIコンテナにクラスを登録する方法(JavaConfigの場合)
@Configurationを付けたクラスに、DIコンテナに登録したいクラスのインスタンスを返す
getterを定義して@Beanを付ける。
考察
・xmlとJavaConfigはxmlとjavaの言語の違いがあるだけなので、とりあえずxmlはおいといて、
アノテーションとJavaConfigの実装方法だけ把握しとけば、xmlでの実装が求められる状況に
なってもなんとかなりそう。
・詳細設計、製造の経験を多く積んで、ある程度設計の知見を得てからでないとDIのメリットを
十分に理解できそうにない。
・JavaConfigは、テストパターンが多い場合の作業の効率化に役立ちそう。
補足
・@Autowiredを付けられる箇所は以下である。
・フィールド変数
・コンストラクタの引数
・setterの引数
参考文献
・【後悔しないための入門書】Spring解体新書: Spring Boot2で実際に作って学べる!Spring
Security、Spring JDBC、Spring MVC、Spring Test、Spring MyBatisなど多数解説!
作者: 田村達也