[解決済み】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はまだ使えますが、必要ではありません。自分でモックを作って、コンストラクタを呼び出すだけでインジェクトできます。
関連
-
[解決済み】自動配線された依存関係のインジェクションに失敗しました。
-
[解決済み] C++で、あるコンストラクタを別のコンストラクタから呼び出す(コンストラクタ・チェイニングを行う)ことは可能ですか?
-
SpringBootのテスト
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] C#でベースコンストラクタを呼び出す
-
[解決済み] コンストラクタ内の仮想メンバー呼び出し
-
[解決済み] あるコンストラクタを別のコンストラクタから呼び出す
-
[解決済み] Spring Frameworkの@Injectと@Autowiredの違いは何ですか?どのような条件でどちらを使うか?
-
[解決済み】ユニットテスト中のSpring @Valueの入力について
-
[解決済み] YAMLを使ったSpring @PropertySource
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 例外を取得しました。springSecurityFilterChain'という名前のビーンが定義されていません。
-
[解決済み] SpringBootです。以下の候補からメインクラスを1つも見つけることができません。
-
FunctionService' タイプのビーンが見つかりませんでした。
-
SpringBootのテスト
-
[解決済み] java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log
-
[解決済み】SpringのGA、RC、M2リリースの違いは何ですか?
-
[解決済み] Spring RESTfulアプリケーションでResponseEntity<T>と@RestControllerを使用する場合
-
[解決済み] プロパティファイルから値を読み込むには?
-
[解決済み] コンストラクタの引数を必要とする Bean を @Autowire する方法はありますか?
-
[解決済み] コンテンツタイプ 'application/x-www-form-urlencoded;charset=UTF-8' は @RequestBody MultiValueMap ではサポートされていません。