春-依存性注入

すべてのJavaベースのアプリケーションには、エンドユーザーが機能しているアプリケーションと見なすものを提示するために連携して機能するいくつかのオブジェクトがあります。複雑なJavaアプリケーションを作成する場合、アプリケーションクラスは他のJavaクラスから可能な限り独立している必要があります。これにより、これらのクラスを再利用し、単体テスト中に他のクラスから独立してテストできるようになります。依存性注入(またはワイヤリングと呼ばれることもあります)は、これらのクラスを結合すると同時に、それらを独立させるのに役立ちます。

テキストエディタコンポーネントを備えたアプリケーションがあり、スペルチェックを提供したいとします。標準コードは次のようになります-

public class TextEditor {
   private SpellChecker spellChecker;
   
   public TextEditor() {
      spellChecker = new SpellChecker();
   }
}

ここで行ったことは、TextEditorとSpellCheckerの間に依存関係を作成することです。制御の反転シナリオでは、代わりに次のようなことを行います-

public class TextEditor {
   private SpellChecker spellChecker;
   
   public TextEditor(SpellChecker spellChecker) {
      this.spellChecker = spellChecker;
   }
}

ここで、TextEditorはSpellCheckerの実装について心配する必要はありません。SpellCheckerは独立して実装され、TextEditorのインスタンス化時にTextEditorに提供されます。この手順全体は、SpringFrameworkによって制御されます。

ここでは、TextEditorから完全な制御を削除し、それを別の場所(つまり、XML構成ファイル)に保持し、依存関係(つまり、クラスSpellChecker)をクラスTextEditorに挿入しています。 Class Constructor。したがって、依存性を何らかの外部システムに効果的に委任したため、制御の流れは依存性注入(DI)によって「反転」されました。

依存関係を注入する2番目の方法は Setter MethodsSpellCheckerインスタンスを作成するTextEditorクラスの このインスタンスは、TextEditorのプロパティを初期化するためのsetterメソッドを呼び出すために使用されます。

したがって、DIは2つの主要なバリアントで存在し、次の2つのサブチャプターで両方を例で説明します。

シニア番号 依存性注入のタイプと説明
1 コンストラクターベースの依存性注入

コンストラクターベースのDIは、コンテナーが、それぞれが他のクラスへの依存関係を表すいくつかの引数を持つクラスコンストラクターを呼び出すときに実行されます。

2 セッターベースの依存性注入

セッターベースのDIは、引数なしのコンストラクターまたは引数なしの静的ファクトリメソッドを呼び出してBeanをインスタンス化した後、コンテナーがBeanのsetterメソッドを呼び出すことによって実現されます。

コンストラクターベースのDIとセッターベースのDIの両方を混在させることができますが、必須の依存関係にはコンストラクター引数を使用し、オプションの依存関係にはセッターを使用することをお勧めします。

コードはDIの原則によりクリーンであり、オブジェクトに依存関係が提供されている場合、デカップリングはより効果的です。オブジェクトはその依存関係を検索せず、依存関係の場所やクラスを認識しません。むしろ、すべてがSpringFrameworkによって処理されます。