20
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

概要

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で済ますのかを選択できるようになるのは、個人的に嬉しい。

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

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

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

まとめ

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

20
16
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
20
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?