1
1

More than 3 years have passed since last update.

【Java】Spring DI③

Posted at

DIで何ををやってるんですか?

  • DIの管理対象クラスを探す(コンポーネントスキャン)
  • インスタンスの生成と注入

コンポーネントスキャン

  • Springを起動時にDIで管理する対象のアノテーションが付けられているクラスを探す処理が走り、DIコンテナに登録する
  • DIコンテナ上で管理するクラスをBeanという

【スキャン対象のアノテーション】

インスタンス生成と注入

  • 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+アノテーション

アノテーションベース

JavaConfig

  • @Configurationアノテーションを付けたクラスを用意
  • そのクラス中に、@Beanアノテーションが付いたgetterメソッドを用意
  • getterの戻り値がBeanとしてDIコンテナに登録される
  • DIコンテナの中で、JavaConfigクラス、Beanのインスタンスを用意しておいて、@Autowired箇所で各インスタンスをgetterで取得できる
  • アノテーションベースと違い、@Beanアノテーションが付いたgetterの戻り値をDIコンテナで管理
  • つまりDIコンテナで管理するインスタンス分のメソッドを用意する必要
  • 細かい設定や切り替えができる

JavaConfig+アノテーション

  • DIで管理したいクラスに@Controllerなどのアノテーションを付ける
  • 細かい設定などをしたいインスタンスだけ、JavaConfigで設定
  • 小規模なアプリケーションはアノテーションベースで作って規模が大きくなったり、設定の切り替えなどを行いたい場合にJavaConfig+アノテーションで実装

xmlベース

  • JavaConfigで設定するのと同じ内容をxmlで行う
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1