SpringのDIコンテナ
DIコンテナを使うといろいろ嬉しい
自動でインスタンス生成してくれる
そのインスタンスは依存オブジェクトとして注入される(DI)
インスタンスのスコープを管理できる
DIコンテナを使うのに必要なこと
DIコンテナに使いたいインスタンスを登録する(Bean定義)
DIコンテナに登録されているインスタンスを指定して取り出す(ルックアップ)
DIコンテナの用語の整理
「Bean」:DIコンテナに登録するコンポーネント
「Bean定義」:DIコンテナにコンポーネントを登録すること
「ルックアップ」:DIコンテナからBeanを取得すること
インジェクションも同じ意味?
Bean定義の方法によってルックアップ(インジェクション)の仕方が異なる
JavaベースConfiguration
クラス内のメソッドからインスタンス取得してインジェクション
アノテーションベースConfiguration
@Autowiredをつける
※Spring4.3からはコンストラクタが1つのみであれば、@Autowiredなしでもよい
インジェクションの種類(どこにインジェクションするか)
セッターインジェクション
コンストラクタインジェクション
フィールドインジェクション
アノテーションベースConfigurationのインジェクション(ルックアップ)
インジェクションしたいとこの上に@Autowiredをつける
@Autowiredをつけた型がインタフェース型のときは、それを実装しているクラス型のインスタンスを生成する
実装クラスが複数存在しているときは特定できないため、@QualifierでBean名を指定する
Beanのスコープ
staticメソッドの代わりにDIコンテナを使う?
状態を必要としないメソッドがあるとする
それはstaticメソッドにすればわざわざインスタンス生成が必要ない
しかし、内部でstaticメソッドを使用しているクラスはテストしづらい(置きかえられないので)
そこでDIコンテナを使ってインタフェース型のフィールドにDIすれば、「インスタンス生成不要」かつ「テストするときは実装クラスを切り替えればよいのでテストが用意になる」
Spring Tips - DI 依存性の注入のメリット - ぺんぎんらぼ
参考文献:Spring徹底入門 Chapter2
public.icon