Spring @Autowire のプロパティとコンストラクタについて質問する

Spring @Autowire のプロパティとコンストラクタについて質問する

私は 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 を使用できない)

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

ベストアンサー1

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

  • 依存関係は明確に識別されます。テスト時や、他の状況でオブジェクトをインスタンス化する場合(構成クラスで Bean インスタンスを明示的に作成するなど)に依存関係を忘れることはありません。
  • 依存関係は最終的なものになる可能性があり、堅牢性とスレッドの安全性に役立ちます。
  • 依存関係を設定するためにリフレクションは必要ありません。InjectMocksはまだ使用できますが、必須ではありません。自分でモックを作成し、コンストラクタを呼び出すだけで注入できます。

見るこのブログ投稿より詳しい記事については、Springの寄稿者の一人による記事をご覧ください。オリヴィエ・ギェルケ

おすすめ記事