Spring フレームワークのシングルトンおよびプロトタイプ Bean スコープ

Spring Framework は、依存関係注入の事実上のフレームワークであり、スケーラブルで回復力があり、安全なクラウドネイティブ環境の開発において実績があります。

Spring Bean を使用する場合、初心者は Spring Bean とその範囲について少し混乱することがよくあります。

以下は、シングルトン Bean とプロトタイプ Bean のスコープの簡単な例を説明する試みです。

シングルトン Bean スコープ: その名前が示すように、シングルトン スコープの Bean は Spring アプリケーション コンテキストで使用できるインスタンスを 1 つだけ持ちますが、Spring 定数では同じ Bean が異なる Bean 名で複数のインスタンスを持つことができることに注意してください。

この考え方は、Java クラスがシングルトンとして設計されると、JVM はメモリ内で使用できるインスタンスが 1 つだけになるというシングルトン設計パターンの概念とは多少異なります。

図 1.0 以下の図は、アカウント サービス Spring Bean を示しています。Bean には異なる名前を付けることができます。Spring コンテキストでは、同じサービスが 2 つの異なる名前で存在できます。

5ce67ff733879582bd9ded16fafb0803.jpeg
 

Java アプリケーションでシングルトン クラスを参照する場合、使用できるクラスのインスタンスは 1 つだけですが、Spring では、シングルトンはコンテキスト内にその型のインスタンスが 1 つだけあるという意味ではなく、複数のインスタンスを持つことができます。異なる名前のタイプ。例。

プロトタイプ Bean のスコープ: アプリケーション プログラマが Bean のスコープをプロトタイプとして定義すると、誰かが Bean への参照をリクエストするたびに、Spring フレームワークが完全に新しい Bean インスタンスを返すことになります。Spring フレームワークはオブジェクトの種類を管理します。

図 1.1: 以下の図は、プロトタイプ スコープの Bean を定義し、Spring をリクエストするたびに、Spring がリクエストされた Bean の新しいインスタンスを提供することを説明しています。

8a1c8ffc075972c1e6a0454c00ebbffa.jpeg
 

なぜ Bean にプロトタイプ スコープが必要なのでしょうか?

プロトタイプのスコープは、2 つのスレッドが Singleton Bean にアクセスするときの競合状態を回避することです。マルチスレッド環境のインターリーブの性質により、これは、操作の結果が予測できないという古典的な同時実行性の問題です。したがって、各スレッドが Bean の独自のコピーを確実に取得できるようにするために、開発者は、各スレッドが独自のコピーを確実に取得できるようにしたいと考えています。

競合状態とは何ですか?

ストックアプリを例に考えてみましょう。株価は毎秒更新され、特定の株 ID の株価を更新するために使用されるコードは同時実行コンテキストで記述されます。つまり、複数の呼び出し元が株 X の価格を更新しようとする可能性があります。一連のステップを考えてみましょう。

1.マイクは株 X の価格を 110 ドルに更新しようとします。2.マイクは株 X の価格を読み取り、それを 120 ドルに引き上げます。3. 一方、マイクはこれをメインメモリに書き込む前にトイレに行きます。4. ボブはコーヒーを持って戻ってきて、画面上の古い株価が 105 であることを確認します。彼は株 X の価値を 125 ドルに更新します。5.マイクが戻ってきて、株式 X の価値を再度 120 ドルに更新します。6. この構造のため、マイクが株式 X に対して実行しようとしている更新はボブには表示されず、再度上書きされます。7. これは典型的な競合状態です。同時環境では Mike と Bob がスレッド A とスレッド B に置き換えられるのと同じように、皆さんも理解していただければ幸いです。

StockPrice がプロトタイプ スコープの Bean として定義されている場合、各スレッドは StockPrice の独自のコピーを取得し、相互に干渉しません。ただし、株価のさまざまなコピーを取得しても、特定の株式の株価更新を同期する必要がなくなるわけではありません。一連のアトミックなステップで行う必要がありますが、複雑さを避けるため、理解するためにこの説明を省略できます。プロトタイプ Bean のスコープ。

図 1.2: 次の図は、プロトタイプ スコープの Bean を定義し、各スレッドがプロトタイプ Bean の新しいインスタンスを取得することを説明しています。

9c2695937836cd20381cd5a7f9cd7e48.jpeg

要約:

1. デフォルトでは、Spring Bean のスコープはシングルトンです。2.Singleton スコープの Bean は、Spring アプリケーション コンテキストで異なる名前で複数のインスタンスを持つことができます。3. プロトタイプ Bean は Spring フレームワークによって提供される規約であり、Bean の新しいインスタンスは要求されるたびにフレームワークによって提供されます。4. プロトタイプ スコープの Bean はシングルトン スコープの Bean に使用できますが、コンテキストから Bean を取得する方法に注意する必要があります。プロトタイプ Bean がシングルトン Bean 内で定義されている場合、提供されるプロトタイプ Bean インスタンスは 1 つだけになるためです。 Spring. 、それ自体の目的を破ります。5. 競合状態を回避するために、プロトタイプ Bean スコープを使用できます。


おすすめ

転載: blog.csdn.net/weixin_37604985/article/details/132440007