Dependency Injection
汚いメモ
- DIに関する基本的な用語
- DIコンテナ(Application Context)
- コンフィギュレーション
- Bean定義
- Bean
- Beanとは
- DIコンテナで管理されるオブジェクトのこと。
- Bean定義とは
- Beanとして管理したい具象クラスを指定すること(←少し説明がおかしい)
- Bean定義の方法は次の3つ。
- ステレオタイプアノテーション
- Bean管理したい具象クラスに以下のいずれかのアノテーションをつける。
- @Searvice, @Controller, @Component, @Repository
- Bean管理したい具象クラスに以下のいずれかのアノテーションをつける。
- Beanメソッド
- @Beanを付与したメソッドのこと。
- Bean管理したい具象クラスのオブジェクトを戻り値とする。
- @Configurationを付与したクラス内(JavaConfig)内で定義されるメソッド。
- beanタグ?
- xml?でBean定義する方法。よくわからん。
- ステレオタイプアノテーション
- コンフィギュレーションとは
- DIコンテナに読み込ませる情報を記載したクラス。通称JavaConfig。
- @Configurationを付与する。
- @ComponentScanを付与することで、JavaConfigを基点とするパッケージとその子パッケージを範囲としてコンポーネントスキャンが行われる。
- コンポーネントスキャンが行われると、対象範囲にあるステレオタイプアノテーションがついた具象クラスのオブジェクトがDIコンテナに登録される。
- DIコンテナとは
- Beanを登録・管理するオブジェクト。
- ApplicationContextの具象クラスがDIコンテナと呼ばれる。
- DIコンテナのオブジェクトがコンストラクタで作られる場合は、コンストラクタの引数にコンフィグレーションが渡される。個数はわすれた。
- 引数に渡したコンフィギュレーションに@ComponentScanが付与されている場合はコンポーネントスキャンが行われ、ステレオタイプアノテーションがついた具象クラスがDIコンテナに登録される。
- Dependency Injection(依存性注入)とは
- 依存する側のオブジェクトのフィールドに依存される側のオブジェクトをセットすること。
- インジェクションの方法は3つ。
- コンストラクタインジェクション
- 依存する側のオブジェクトのコンストラクタに@Autowiredを付与する。
- コンストラクタが一つしかない場合は@Autowiredを付与する必要なし。
- コンストラクタ実行時に、引数に設定された依存オブジェクトをDIコンテナから探し、引数に渡して、フィールドにセットされる。
- Setterインジェクション
- 依存する側のオブジェクトのSetterに@Autowiredを付与する。
- フィールドインジェクション
- 依存する側のオブジェクトのフィールドに@Autowiredを付与する。
- コンストラクタインジェクション
- 3つの中ではコンストラクタインジェクションが最もおすすめ?
- 理由
- 依存する側のフィールドにfinal修飾子をつけた上でコンストラクタで依存性注入することで、開発者がフィールドの内容を勝手に変更できないようにできるから。
- 理由
- Beanメソッドについて
- JavaConfigに定義することができる、@Beanを付与したメソッドのこと。
- DIコンテナで管理したいオブジェクトを戻り値とするメソッド。
- 依存性注入したい場合はBeanメソッドの引数に依存オブジェクトのクラスを型とする引数を設定する。
- SpringがDIコンテナからそのオブジェクトを探して注入してくれる。
- ステレオタイプアノテーションとBeanメソッドのどちらでBean定義するか問題。
- 自作のクラス→ステレオタイプアノテーションが良い。クラス数が多くなる可能性が高いから。
- ライブラリで提供されるクラス→Beanメソッドが良い(でしか無理)
- DataSourceインターフェースを実装した具象クラスなどはライブラリで提供されるが、これはBeanメソッドでBean定義する。メソッド内でDB接続先などを設定する。