Spring-dependency-injection

提供:Dev Guides
移動先:案内検索

春-依存性注入

すべての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に提供されます。 この手順全体は、Spring Frameworkによって制御されます。

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

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

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

Sr.No. Dependency Injection Type & Description
1

Constructor-based dependency injection

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

2

Setter-based dependency injection

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

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

コードはDIの原則により簡潔になり、オブジェクトに依存関係が提供されると、分離がより効果的になります。 オブジェクトは依存関係を検索せず、依存関係の場所やクラスを認識しません。むしろ、Spring Frameworkがすべてを処理します。