私が初めて Spring を使い始めたとき、最も興味をそそられた概念の 1 つは、Bean スコープのアイデアでした。 Spring は、Spring コンテナ内で作成される Bean のライフサイクルを決定するさまざまな Bean スコープを提供します。最も一般的に使用される 2 つのスコープは、Singleton と Prototype です。これらのスコープを理解することは、効率的かつ効果的な Spring アプリケーションを設計するために重要です。そのため、それらについて私が学んだことを順に説明していきます。
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 の主な利点はメモリ効率です。単一のインスタンスを再利用することで、アプリケーションが消費するメモリが減り、オブジェクトの作成と破棄のオーバーヘッドが最小限に抑えられます。ただし、状態を維持するシングルトン Bean には注意することが重要です。シングルトン Bean が誤って状態 (例: インスタンス変数) を保持すると、この状態が複数のクライアント間で共有される可能性があり、データの不整合が生じる可能性があります。
Singleton とは対照的に、Prototype スコープは、Spring コンテナから Bean がリクエストされるたびに新しい Bean インスタンスを作成します。これについて学んだとき、プロトタイプ Bean が、使用するたびに新しいインスタンスが必要なシナリオに役立つことは明らかでした。
Bean が Prototype スコープで定義されている場合、Spring は Bean がリクエストされるたびに新しいインスタンスを返します。プロトタイプ Bean を定義する方法は次のとおりです:
この例では、Spring コンテキストから MyService Bean をリクエストするたびに、Spring は MyService の新しいインスタンスを作成します。
プロトタイプ Bean は、ステートフル Bean (クライアント固有の状態を維持するもの、または使用ごとに固有の構成を必要とするもの) を扱う場合に特に役立ちます。典型的な使用例には次のようなものがあります:
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.
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:
Let me provide a practical scenario that might help clarify when to use each scope. Suppose I’m building an online shopping application.
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 ProvidermyPrototypeServiceProvider; 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.
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 サイトの他の関連記事を参照してください。