[解決済み】フィールド・インジェクションとは何ですか、またそれを回避する方法は?
質問
Spring MVC とポートレットに関するいくつかの記事で、次のように書かれています。
フィールドインジェクション
は推奨されません。私の理解では
フィールドインジェクション
でBeanをインジェクトした場合です。
@Autowired
このように
@Component
public class MyComponent {
@Autowired
private Cart cart;
}
また、研究中、私は コンストラクタ注入 :
@Component
public class MyComponent {
private final Cart cart;
@Autowired
public MyComponent(Cart cart){
this.cart = cart;
}
}
この2種類の注射のメリットとデメリットは何ですか?
EDIT 1: この質問は、次の質問と重複しています。 この質問 確認しました。質問にも回答にもコード例がないので、私が使っているインジェクションタイプの推測が正しいかどうかは不明です。
どのように解決するのですか?
インジェクションの種類
依存関係をビーンに注入する方法として、3つのオプションがあります。
- コンストラクタを使用する
- セッターや他のメソッドを介して
- リフレクションにより、フィールドに直接入力する
あなたはオプション3を使用しています。を使用すると、そのようなことが起こります。
@Autowired
を直接フィールドに貼り付けてください。
インジェクションのガイドライン
一般的なガイドラインです。 Springが推奨する (のセクションを参照してください)。 コンストラクタベースのDI または セッターベースDI )は以下の通りです。
- 必須の依存関係や不変性を目指す場合は、コンストラクタ注入を使用します。
- オプションまたは変更可能な依存関係には、セッターインジェクションを使用します。
- ほとんどの場合、フィールドインジェクションは避けてください
フィールドインジェクションの欠点
フィールドインジェクションが嫌われる理由は、以下の通りです。
- コンストラクタ注入のように、イミュータブルオブジェクトを作成することはできません。
- クラスはDIコンテナと緊密に結合しており、DIコンテナの外では使用できない。
- クラスはリフレクションなしでは(ユニットテストなどで)インスタンス化できない。インスタンス化するためにDIコンテナが必要で、テストは統合テストに近くなります。
- 実際の依存関係は外から見えないようになっており、インターフェイス(コンストラクタやメソッド)には反映されません。
- 10個のような依存関係を持つことは本当に簡単です。コンストラクタ注入を使用している場合、10個の引数を持つコンストラクタが存在することになり、何か怪しいというシグナルが発せられるでしょう。しかし、フィールドインジェクションを使えば、注入されたフィールドを無限に追加することができます。依存関係が多すぎるということは、そのクラスが通常複数のことを行っていて、単一責任原則に違反している可能性があるという赤信号です。
結論
ニーズに応じて、コンストラクタ注入を主に使用するか、コンストラクタとセッタの注入をいくつか組み合わせて使用する必要があります。フィールドインジェクションには多くの欠点があるため、避けるべきでしょう。フィールドインジェクションの唯一の長所は、より便利に書けることですが、それはすべての短所を上回るものではありません。
その他の資料
フィールドインジェクションが通常推奨されない理由について、ブログ記事を書きました。 フィールド依存性注入は有害であると考えられている .
関連
-
[解決済み] ORA-01654: インデックスを拡張できません。
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] リフレクションとは何か、なぜ有用なのか?
-
[解決済み] Javaで配列を宣言し、初期化する方法は?
-
[解決済み] JavaBeanとは何ですか?
-
[解決済み] Spring Frameworkの@Injectと@Autowiredの違いは何ですか?どのような条件でどちらを使うか?
-
[解決済み】JSP 2を使用して、JSPファイル内のJavaコードを回避するにはどうすればよいですか?
-
[解決済み】Apache Camelとは一体何ですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] maven. -source 1.5ではラムダ式がサポートされていません。
-
[解決済み] java.util.concurrent.ExecutionException 例外をどのように処理しますか?
-
[解決済み] Androidのコールバックとは何ですか?重複
-
[解決済み] 午前0時からの時間を秒単位で取得する方法
-
[解決済み] Javaにおけるシンボリック参照
-
[解決済み] java.lang.ClassCastException: java.lang.Long を java.lang.Integer にキャストできない(java 1.6
-
[解決済み] Eclipseでクラスとそれに対応するファイルの名前を変更する方法は?
-
[解決済み] java swingアプリケーションでJCEがプロバイダBCを認証できない
-
[解決済み] x--やx++はここで何をするのですか?
-
[解決済み] .lengthが解決できない、またはフィールドでない