I.はじめに
我々は、開発のためのSpringフレームワークを使用する場合、それは依存性注入(依存性注入)には避けられない、使用するインスタンスのSpringコンテナから削除されます。春の依存関係3つの主噴射、それぞれコンストラクタ、セッター、およびフィールドがあります。選択の余地と、これらの3つの方法がこれより良い、来る場所を絡まっ?
第二に、注入法の比較
コンストラクタ・インジェクション
プライベートDependencyA dependencyA。 @Autowired 公共DI(DependencyA dependencyA){ この .dependencyA = dependencyA。 }
セッター・インジェクション
プライベートDependencyB dependencyB。 @Autowired 公共 ボイドsetDependencyB(DependencyB dependencyB){ この .dependencyB = dependencyB。 }
フィールド注入
@Autowired プライベート DependencyC dependencyC。
注入方法の第三に、選択
これらの3つの方法の比較では、フィールド注入は新鮮できれいに見えました。、書き込み、読み出しと非常に喜ばへの高速で便利な時間は、それがああ、それを使用することを選択する優先順位を与えるように設定に見えます。しかし、このアプローチはいくつかの欠点があります。
- シンプル、簡潔なコードのように、ユーザは、クラスで、その結果、あまりに頼るにはあまりにも簡単に注入することができるあまりに多くの責任を引き受けました。単一責任の設計原理に反して。シングル、自己百度の原則に従ってくださいする理由として。
- ない完全なパラメータセットの構成または方法ので、ユーザは、例えばnull参照の新しいデフォルト設定によって可能で、ヌルポインタ例外の使用が起こります。
- DIコンテナ(テスト、他のモジュール)ため、反射に加えて、再利用外できないよう、必要な依存性を提供する他の方法はありません。
- 以下BeanCurrentlyInCreationExceptionは、ほんの一例で報告されたそれは、円形の依存関係を生成することが可能である、ケースは現実にはもっと手ごわい表示されます。
パブリック クラスA { @Autowired プライベートBのB。 } パブリック クラスB { @Autowired プライベートCのC、 } パブリック クラスC { @Autowired プライベートA。 }
春が正式現在、コンストラクタ・インジェクションをお勧めします。それは、アプリケーション・コンポーネントを達成するために人々を可能にするため、公式声明によると不変オブジェクト、および必要なことを確実にするために、依存関係がnullではありません。また、注入アセンブリのコンストラクタは、常に完全に初期化状態では、クライアント(呼び出し)コードに返されます。
-
不変オブジェクト:それは変更することができ、最終的なキーワードを持つフィールドです。
-
nullではない依存しません。そのため、自己定義のコンストラクタで、プログラムは、もはやデフォルトの空の設定パラメータを提供し、インスタンス化に基づいて、必要なすべてのパラメータを渡す必要があります。
-
完全に初期化状態:コンストラクタの役割はJavaのクラスローディングプロセスのインスタンスのメンバ変数を初期化することで、コンストラクタは最後のステップで、コンポーネントは、初期化後の状態に戻ります。
概要
フィールド注入
利点
-
最も簡潔
短所
-
利便性は、構造設計コードを弱体化します
-
-
従属変数ではありません(最終ません)
-
循環依存になりやすいです
-
あなたは、複数のバネやアノテーションを使用する必要があります
集合注射
利点
- 依存性免疫循環
- セッターの追加により、高度に結合されたクラスを容易に識別されます。
短所
- オープンクローズドの原則の違反
- サイクルは非表示に依存します
- 三つの方法ほとんどのテンプレートの方法
- 従属変数ではありません(最終ません)
コンストラクタ・インジェクション
利点
-
それは最終的に依存することができます
-
テストする最も簡単な方法は3つの方法があります。
-
高結合型構成パラメータの成長と容易に識別されます
-
他の開発プラットフォームの開発者は非常に精通しています
-
それは@Autowiredコメントに依存しません
短所
- コンストラクタはサブクラスに落ち着くことが必要