Spring は循環依存関係をどのように解決するか

プロジェクトが成長し続けるにつれて、依存関係も複雑になります。この場合、循環依存の問題が特に顕著になります。Spring フレームワークは、広く使用されている Java エンタープライズ レベルのアプリケーション開発フレームワークとして、循環依存関係に対処するための洗練されたソリューションを開発者に提供します。この記事では、Spring が循環依存関係をどのように解決するかを見ていきます。

循環依存関係とは何ですか?

循環依存関係とは、2 つ以上の Bean 間に相互依存関係が存在し、その結果、完全なオブジェクトを作成できなくなることを指します。たとえば、Bean A は Bean B に依存し、Bean B も Bean A に依存し、依存関係サイクルが形成されます。この状況により、オブジェクト インスタンスが適切に作成されず、アプリケーション全体が動作不能になる可能性があります。

Spring は循環依存関係をどのように解決するのでしょうか?

Spring Framework は、「3 レベル キャッシュ」と呼ばれる手法を使用して循環依存関係を解決します。具体的には、3 レベル キャッシュは次のとおりです。

  1. レベル 1 キャッシュ (シングルトン オブジェクト): 作成された Bean インスタンス、つまり完全なオブジェクトを格納します。
  2. L2 キャッシュ (初期シングルトン オブジェクト): 作成中の Bean インスタンス、つまりプロパティ インジェクションがまだ完了していないオブジェクトを格納します。
  3. 3 レベル キャッシュ (シングルトン ファクトリ): Bean インスタンスのファクトリ オブジェクトを格納します。これは、まだ作成されていない完全な Bean インスタンスを取得するために使用されます。

Spring フレームワークは、Bean を作成するプロセスで次の手順に従います。

  1. まず、Bean インスタンスが一次キャッシュに存在するかどうかを確認し、存在する場合は直接返します。
  2. 1 次キャッシュに存在しない場合は、2 次キャッシュに Bean インスタンスが存在するかどうかを確認し、存在する場合は直接戻ります。
  3. それでも 2 次キャッシュに存在しない場合は、3 次キャッシュから Bean インスタンスのファクトリ オブジェクトを取得し、その getObject メソッドを呼び出して Bean インスタンスを作成します。このプロセス中に、新しく作成された Bean インスタンスが 2 次キャッシュに追加されます。
  4. Bean の依存関係が処理されると、Bean インスタンスは 2 次キャッシュから 1 次キャッシュに移動され、対応するファクトリ オブジェクトが 3 次キャッシュから削除されます。

この 3 レベルのキャッシュ メカニズムを通じて、Spring は Bean の作成プロセスにおける循環依存の問題を解決できます。循環依存関係が発生した場合、相互依存する Bean インスタンスはすでに 2 次キャッシュにあるため、直接取得して注入できるため、デッドロック現象が回避されます。

Spring フレームワークは、シングルトン スコープでの循環依存関係の解決のみをサポートしていることに注意してください。プロトタイプ (Prototype) スコープを持つ Bean の場合、Bean を取得するたびに新しいインスタンスが作成されるため、この場合 Spring では循環依存の問題を解決できません。

循環依存関係を回避するにはどうすればよいでしょうか?

Spring フレームワークは循環依存関係の問題を解決できますが、実際の開発プロセスでは、循環依存関係をできる限り回避することが最善です。以下にいくつかの提案を示します。

  1. モジュールとパッケージを合理的に分割する: 同様の機能を持つクラスを同じパッケージまたはモジュール内に編成することで、循環依存関係のリスクを軽減できます。
  2. インターフェイス分離を使用する: 別のクラスに依存する必要がある場合は、具体的な実装クラスではなくインターフェイスに依存するようにしてください。これにより、クラス間の結合の度合いが減り、循環依存関係が発生する可能性が減ります。
  3. 依存関係逆転の原則: 高レベルのモジュールは低レベルのモジュールに依存すべきではなく、両方とも抽象化に依存する必要があるという依存関係逆転の原則に従います。これにより、モジュール間の結合が軽減され、循環依存関係が回避されます。

要約する

Spring フレームワークは、3 レベルのキャッシュ メカニズムを導入することにより、シングルトン スコープの Bean の作成プロセスにおける循環依存の問題を解決できます。ただし、実際の開発では、システムの複雑さと保守コストを軽減するために、循環依存関係の生成を避けるように努める必要があります。モジュール性、インターフェイスの分離、依存関係の逆転の原則などの設計原則に従うことは、コードをより適切に管理し、循環依存関係のリスクを軽減するのに役立ちます。

おすすめ

転載: blog.csdn.net/kaka_buka/article/details/129985821