シングルトンおよびプロトタイプ Spring Bean スコープ: 詳細な調査

WBOY
リリース: 2024-09-01 08:30:32
オリジナル
744 人が閲覧しました

Singleton and Prototype Spring Bean Scopes: A Detailed Exploration

私が初めて Spring を使い始めたとき、最も興味をそそられた概念の 1 つは、Bean スコープのアイデアでした。 Spring は、Spring コンテナ内で作成される Bean のライフサイクルを決定するさまざまな Bean スコープを提供します。最も一般的に使用される 2 つのスコープは、Singleton と Prototype です。これらのスコープを理解することは、効率的かつ効果的な Spring アプリケーションを設計するために重要です。そのため、それらについて私が学んだことを順に説明していきます。

Spring Bean のスコープを理解する

Spring では、Bean は Spring IoC (制御の反転) コンテナーによってインスタンス化、アセンブル、および管理されるオブジェクトです。 Bean スコープは、Bean のライフサイクル、つまり Bean インスタンスがいつ、どのように作成され、どれくらいの期間存続するかを指します。

Spring にはいくつかの Bean スコープが用意されていますが、ここでは次の 2 つに焦点を当てます。

  • シングルトンスコープ
  • プロトタイプのスコープ

各スコープには固有の使用例があり、適切な使用例を選択すると、アプリケーションの動作とパフォーマンスに大きな影響を与える可能性があります。

シングルトンスコープ

Singleton スコープは Spring のデフォルトのスコープであり、私が最も頻繁に使用するスコープです。 Bean が Singleton スコープで定義されている場合、Spring コンテナはその Bean のインスタンスを 1 つだけ作成し、この単一のインスタンスがアプリケーション コンテキスト全体で共有されることを意味します。

仕組み

Bean をシングルトンとして宣言すると、アプリケーション コンテキストの起動中または最初の参照時に、Bean が初めてリクエストされたときに Spring によって Bean インスタンスが作成されます。その後、この Bean に対する後続のリクエストはすべて同じインスタンスを返します。

これは簡単な例です:

リーリー

この例では、myService() はシングルトン Bean です。 Spring コンテキストから MyService Bean をリクエストするたびに、同じインスタンスを取得します。

シングルトン Bean の使用例

シングルトン スコープは、クライアント固有の情報を保持しないステートレス Bean に最適であることがわかりました。例:

  • サービス クラス: 通常、これらのクラスには、個別のインスタンスを必要とせずにアプリケーション全体で共有できるビジネス ロジックが含まれています。
  • DAO クラス: 通常、DAO クラスはデータベースと対話し、クライアント固有の状態を維持しないため、単一のインスタンスで十分です。

利点と考慮事項

シングルトン Bean の主な利点はメモリ効率です。単一のインスタンスを再利用することで、アプリケーションが消費するメモリが減り、オブジェクトの作成と破棄のオーバーヘッドが最小限に抑えられます。ただし、状態を維持するシングルトン Bean には注意することが重要です。シングルトン Bean が誤って状態 (例: インスタンス変数) を保持すると、この状態が複数のクライアント間で共有される可能性があり、データの不整合が生じる可能性があります。

プロトタイプの範囲

Singleton とは対照的に、Prototype スコープは、Spring コンテナから Bean がリクエストされるたびに新しい Bean インスタンスを作成します。これについて学んだとき、プロトタイプ Bean が、使用するたびに新しいインスタンスが必要なシナリオに役立つことは明らかでした。

仕組み

Bean が Prototype スコープで定義されている場合、Spring は Bean がリクエストされるたびに新しいインスタンスを返します。プロトタイプ Bean を定義する方法は次のとおりです:

リーリー

この例では、Spring コンテキストから MyService Bean をリクエストするたびに、Spring は MyService の新しいインスタンスを作成します。

プロトタイプ Bean の使用例

プロトタイプ Bean は、ステートフル Bean (クライアント固有の状態を維持するもの、または使用ごとに固有の構成を必要とするもの) を扱う場合に特に役立ちます。典型的な使用例には次のようなものがあります:

  • Command Objects: If I’m implementing a pattern like Command, where each command is executed separately and maintains its own state, a Prototype bean is the right choice.
  • Session or Request Scoped Beans: In web applications, beans that are specific to a user session or request can be defined as Prototype to ensure a new instance is created for each user or request.

Benefits and Considerations

The primary advantage of using Prototype beans is the flexibility it offers in creating new instances. This is particularly useful when dealing with stateful objects. However, there’s a trade-off in terms of performance and resource usage. Since a new instance is created every time, it can lead to higher memory consumption and more frequent garbage collection. Moreover, unlike Singleton beans, Spring does not manage the lifecycle of Prototype beans beyond creation, so I have to handle the destruction and cleanup of these beans manually.

Singleton vs. Prototype: Choosing the Right Scope

One of the key decisions I face when designing a Spring application is choosing between Singleton and Prototype scope. Here’s a summary of the factors I consider:

  • Statefulness: If the bean is stateless, Singleton is usually the best choice. For stateful beans, Prototype is more appropriate.
  • Resource Management: Singleton beans are more memory efficient since only one instance is maintained. Prototype beans, while offering more flexibility, consume more resources.
  • Lifecycle Management: Singleton beans are managed by the Spring container throughout their lifecycle. In contrast, I must manage the full lifecycle of Prototype beans.

Practical Example

Let me provide a practical scenario that might help clarify when to use each scope. Suppose I’m building an online shopping application.

  • Shopping Cart Service: This service would typically be stateless and would be a good candidate for a Singleton bean. There’s no need to create a new instance every time, and the same service can handle multiple requests.
  • Order Processing: On the other hand, the Order object that represents a customer’s order would be stateful, holding details specific to that order. Therefore, it should be a Prototype bean so that each order is handled by a separate instance of the Order class.

Mixing Scopes: A Word of Caution

One thing I’ve learned the hard way is that mixing Singleton and Prototype beans can lead to unexpected issues. For example, injecting a Prototype-scoped bean into a Singleton bean can result in the Singleton bean always using the same instance of the Prototype bean. To avoid this, I usually inject a Provider or use the @Lookup annotation to ensure a new instance of the Prototype bean is created every time it is needed.

@Service public class SingletonService { @Autowired private Provider myPrototypeServiceProvider; public void usePrototypeService() { MyPrototypeService prototypeService = myPrototypeServiceProvider.get(); prototypeService.execute(); } }
ログイン後にコピー

In this example, myPrototypeServiceProvider.get() ensures that a new instance of MyPrototypeService is created every time it is called within the Singleton bean.

GoodBye !

Understanding the nuances of Singleton and Prototype bean scopes in Spring has been critical in my journey as a developer. Both scopes offer distinct advantages depending on the use case, and choosing the right one can significantly impact the performance and design of an application.

In my experience, Singleton is the go-to scope for most beans due to its efficiency and simplicity, while Prototype is reserved for those special cases where I need a fresh instance every time. By carefully considering the statefulness of my beans and how they are used within the application, I can make informed decisions that lead to better, more maintainable Spring applications.

以上がシングルトンおよびプロトタイプ Spring Bean スコープ: 詳細な調査の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!