SpringのAutowiredはコンストラクタに書く


概要

SpringでDIをする時使うAutowiredのアノテーションは使いやすいし便利ですよね!
しかし、使い方が複数あり、どの使い方がいいのか迷うところではあります。
私はよくコンストラクタで使うのですが、そうなった経緯を整理したいと思います。

Autowiredを設定できる方法

ざっくりと復習。Autowiredの設定方法は三種類あります。

フィールドインジェクション

フィールドに直接書くタイプの宣言方法です。

public class A {
    @Autowired
    private B b;
}

コンストラクタインジェクション

コンストラクタに書くタイプの宣言方法です。

public class A {
    private final B b;

    @Autowired
    public A(B b) {
        this.b = b;
    }
}

セッターインジェクション

セッターに書くタイプの宣言方法です。

public class A {
   private B b;

   @Autowired
   public void setB(B b) {
       this.b = b;
   }
}

なぜコンストラクタインジェクションを選ぶのか。

フィールドにfinalを使用することができて、不変性を担保できる。この理由が大きいですね。
こうすることで、処理の途中で書き換えられることがないので安全ですよね。
(保守で訳わからない人でもfinal書き換える時にコンパイルエラーになるから、わかる。本当に)
また、テストでnewしできるのが大きいですね。
テストでDIするか単なるnewで済ますのかを選択できるようになるのは、個人的に嬉しい。

逆にフィールドインジェクションを使用しているのはダメ

そもそも公式が非推奨としているものです。(たしか)
それを、わざわざ使用する意味はないでしょう。

サンプルソースとかでもフィールドインジェクションを使用しているのは信用しないようにしています。
そのぐらいダメだと個人的に思ってます。(すごく楽だけど)

まとめ

どんなソースでもめんどくさがらずにコンストラクタインジェクションを使用しましょうね。