DIコンテナの仕組みを知ろう

SpringBootではDI(依存性注入)を用いた設計が採用されており、コードの依存性を少なくすることができます。

今回は、DIの仕組みについて、例を用いて概要を説明します。

1.DI(依存性注入)のサンプル

DI(依存性注入)とは、プログラムの依存部分を外部から注入することです。

また、

プログラムの依存性とは、あるプログラムを修正した際、関連する他のプログラムにも修正を加えなければいけなくなることです。

では、SpringBootにおける依存性注入の例は以下の通りです。

 

以下のように、OmikujiRepisotoryインタフェースの結果を受け取って表示するAPIがあるとします。

呼び出し側で@Autowiredを付与することで、実装クラスのBeanが自動でomikujiRepository フィールドに注入されます。

OmikujiRepositoryはインタフェースなので、実装クラスであるIseJinguRepositoryImplクラスを作成します。

ここでAPIは一旦完成となります。

 

では、おみくじを引くクラスを、IzumoRepositoryImplに変更したい場合はどうすればいいでしょうか?

IzumoRepositoryImpl実装クラスを作成しましょう。

(邪道ではありますが、)では、IseJinguRepositoryImplクラスの @Componentをコメントアウトし、DIに登録しないようにします。そして再度アプリケーションを起動すると、APIからは “中吉” が返ってくるはずです。

これは、SpringBootの標準の機能として、

あるインタフェースがフィールド化されている時、その実装クラスをBeanから探し出し、注入する

ということが自動で実行されるためです。

これにより、呼び出し側のOmikujiControllerを一切変更することなく、呼び出すクラスを変更することができました。このような技術を、DI(依存性注入)と呼びます。

 

 

2.DIコンテナとは

クラスのインスタンスであるBeanは、DIコンテナという所に保存されます。

SpringBootのクラス間の呼び出し等は、DIコンテナに登録されたBeanを取得することで実行されます。

標準的なBeanの登録方法は、以下の二通りがあります。

  1. @Beanをメソッドに付与する。メソッドの返り値に指定したクラスのシングルトンが、DIコンテナに登録される(サンプル)。
  2. Bean登録したいクラスに、@Componentをクラスに付与する。そのクラスのシングルトンがDIコンテナに登録される(サンプル)。
  3. API宣言である@RestController や 環境クラス宣言である@Configurationt等、付与するだけでそのクラスのBean登録がされるアノテーションを付与する。

 

SpringBootの起動時に、@ComponentScanで指定したパッケージ以下をDIコンテナの読み込み対象にします。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です