DIで何ををやってるんですか?
- DIの管理対象クラスを探す(コンポーネントスキャン)
- インスタンスの生成と注入
コンポーネントスキャン
- Springを起動時にDIで管理する対象のアノテーションが付けられているクラスを探す処理が走り、DIコンテナに登録する
- DIコンテナ上で管理するクラスをBeanという
【スキャン対象のアノテーション】
- @Component
- @Controller
- @Service
- @Repository
- @Configuration
- @RestController
- @ControllAdvice
- @ManagedBean
- @Named
インスタンス生成と注入
- DIコンテナにBeanのインスタンス生成し、注入する
- DI対象のクラス(Bean)を集め、それらのインスタンスをDIが生成(new)
- 生成したインスタンスを以下の@Autowiredアノテーションが付けられるフィールドに注入
- フィールド変数
- コンストラクタの引数
- setterの引数
- コンストラクタの前に@Autowiredを付けることで、引数にインスタンスが渡せる
- イメージは”DIコンテナの中で、各クラスのインスタンスを生成しておいて、そのインスタンスをgetterで取得、@Autowiredが付いているフィールドなどでは、DIコンテナのgetterを呼び出す”
//イメージ
public class DependencyInjection{
//各クラスのインスタンスを生成
private SampleComponent component = new SampleComponent();
private SampleService service = new SampleService();
//SampleComponentインスタンスのgetter
public static SampleComponent getSampleComponent(){
return component;
}
//SampleServiceインスタンスのgetter
public static SampleService getSampleService(){
return service;
}
}
- @Componentなどのアノテーションを付けるだけで、いちいちFactoryクラスを作る手間が省ける!
じゃあどうやって実装するんですか?
- アノテーションベース
- JavaConfig
- xml
- JavaConfig+アノテーション
- xml+アノテーション
アノテーションベース
- @Componentや@Controllerなどがついたクラスを、Springが自動的にDIコンテナに登録
JavaConfig
- @Configurationアノテーションを付けたクラスを用意
- そのクラス中に、@Beanアノテーションが付いたgetterメソッドを用意
- getterの戻り値がBeanとしてDIコンテナに登録される
- DIコンテナの中で、JavaConfigクラス、Beanのインスタンスを用意しておいて、@Autowired箇所で各インスタンスをgetterで取得できる
- アノテーションベースと違い、@Beanアノテーションが付いたgetterの戻り値をDIコンテナで管理
- つまりDIコンテナで管理するインスタンス分のメソッドを用意する必要
- 細かい設定や切り替えができる
JavaConfig+アノテーション
- DIで管理したいクラスに@Controllerなどのアノテーションを付ける
- 細かい設定などをしたいインスタンスだけ、JavaConfigで設定
- 小規模なアプリケーションはアノテーションベースで作って規模が大きくなったり、設定の切り替えなどを行いたい場合にJavaConfig+アノテーションで実装
xmlベース
- JavaConfigで設定するのと同じ内容をxmlで行う