私は 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の寄稿者の一人による記事をご覧ください。オリヴィエ・ギェルケ。