1. ホーム
  2. スプリング

[解決済み】Spring @Autowire プロパティとコンストラクタの違いについて

2022-04-02 17:49:37

質問

で、せっかくSpringを使っているので、依存関係のあるサービスを書くとしたら、以下のようになります。

@Component
public class SomeService {
     @Autowired private SomeOtherService someOtherService;
}

同じ目標を達成するために、別の慣例を使っているコードに出会いました。

@Component
public class SomeService {
    private final SomeOtherService someOtherService;

    @Autowired
    public SomeService(SomeOtherService someOtherService){
        this.someOtherService = someOtherService;
    }
}

どちらの方法もうまくいく、それは理解しています。しかし、オプションBを使用することに何か利点があるのでしょうか?私にとっては、クラスとユニットテストでより多くのコードを作成することになります。(コンストラクタを書かなければならないし、@InjectMocksを使うことができません)。

何か見落としていることはありませんか?ユニットテストにコードを追加する以外に、自動配線コンストラクタが行うことはありますか?これは依存性注入を行うのにもっと好ましい方法なのでしょうか?

どのように解決するのですか?

そうです。オプションB(コンストラクタ注入と呼ばれる)は、実際にはフィールド注入よりも推奨され、いくつかの利点があります。

  • 依存関係が明確に特定される。テストの際や、その他の状況でオブジェクトをインスタンス化する際に、そのことを忘れることはありません (例えば、config クラスで明示的に bean インスタンスを作成するような場合)。
  • 依存関係は最終的なものとすることができるので、堅牢性とスレッドセーフに役立ちます。
  • 依存関係を設定するためにリフレクションは必要ありません。InjectMocksはまだ使えますが、必要ではありません。自分でモックを作って、コンストラクタを呼び出すだけでインジェクトできます。

参照 このブログの記事 は、Springのコントリビューターの一人による、より詳細な記事です。 オリビエ・ギェルケ .