私が初めて 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 をシングルトンとして宣言すると、Spring はアプリケーション コンテキストの起動中または最初の参照時に、Bean インスタンスが最初に要求されたときに Bean インスタンスを作成します。その後、この Bean に対する後続のリクエストはすべて同じインスタンスを返します。
これが簡単な例です:
@Configuration public class AppConfig { @Bean public MyService myService() { return new MyService(); } }
この例では、myService() はシングルトン Bean です。 Spring コンテキストから MyService Bean をリクエストするたびに、同じインスタンスを取得します。
シングルトン スコープはステートレス Bean、つまりクライアント固有の情報を保持しない Bean に最適であることがわかりました。例:
シングルトン Bean の主な利点はメモリ効率です。単一のインスタンスを再利用することで、アプリケーションが消費するメモリが減り、オブジェクトの作成と破棄のオーバーヘッドが最小限に抑えられます。ただし、状態を維持するシングルトン Bean には注意することが重要です。シングルトン Bean が誤って状態 (インスタンス変数など) を保持すると、この状態が複数のクライアント間で共有される可能性があり、データの不整合が生じる可能性があります。
Singleton とは対照的に、Prototype スコープは、Spring コンテナから Bean がリクエストされるたびに新しい Bean インスタンスを作成します。これについて学んだとき、プロトタイプ Bean が、使用するたびに新しいインスタンスが必要なシナリオに役立つことは明らかでした。
Bean が Prototype スコープで定義されている場合、Spring は Bean がリクエストされるたびに新しいインスタンスを返します。プロトタイプ Bean を定義する方法は次のとおりです:
@Configuration public class AppConfig { @Bean @Scope("prototype") public MyService myService() { return new MyService(); } }
この例では、Spring コンテキストから MyService Bean をリクエストするたびに、Spring は MyService の新しいインスタンスを作成します。
プロトタイプ Bean は、ステートフル Bean を扱う場合に特に役立ちます。ステートフル Bean は、ある種のクライアント固有の状態を維持したり、使用ごとに固有の構成を必要としたりします。典型的な使用例には次のようなものがあります:
プロトタイプ Bean を使用する主な利点は、新しいインスタンスを作成する際の柔軟性です。これは、ステートフル オブジェクトを扱う場合に特に便利です。ただし、パフォーマンスとリソース使用量に関してはトレードオフがあります。毎回新しいインスタンスが作成されるため、メモリ消費量が増加し、ガベージ コレクションがより頻繁に発生する可能性があります。さらに、シングルトン Bean とは異なり、Spring は作成後のプロトタイプ Bean のライフサイクルを管理しないため、これらの Bean の破棄とクリーンアップを手動で処理する必要があります。
Spring アプリケーションを設計するときに直面する重要な決定の 1 つは、シングルトン スコープとプロトタイプ スコープのどちらを選択するかです。私が考慮する要素の要約は次のとおりです:
各スコープをいつ使用するかを明確にするのに役立つ実用的なシナリオを紹介します。オンライン ショッピング アプリケーションを構築しているとします。
私が苦労して学んだことの 1 つは、シングルトン Bean とプロトタイプ Bean を混在させると予期せぬ問題が発生する可能性があるということです。たとえば、プロトタイプ スコープの Bean をシングルトン Bean に注入すると、シングルトン Bean は常にプロトタイプ Bean の同じインスタンスを使用することになります。これを避けるために、私は通常、プロバイダーを注入するか、@Lookup アノテーションを使用して、プロトタイプ Bean の新しいインスタンスが必要になるたびに確実に作成されるようにします。
@Service public class SingletonService { @Autowired private ProvidermyPrototypeServiceProvider; public void usePrototypeService() { MyPrototypeService prototypeService = myPrototypeServiceProvider.get(); prototypeService.execute(); } }
この例では、myPrototypeServiceProvider.get() により、Singleton Bean 内で呼び出されるたびに MyPrototypeService の新しいインスタンスが作成されることが保証されます。
Spring のシングルトン Bean スコープとプロトタイプ Bean スコープの微妙な違いを理解することは、開発者としての私の歩みにおいて非常に重要でした。どちらのスコープにも、ユースケースに応じて明確な利点があり、適切なスコープを選択すると、アプリケーションのパフォーマンスと設計に大きな影響を与える可能性があります。
私の経験では、シングルトンはその効率性とシンプルさのため、ほとんどの Bean にとって頼りになるスコープですが、プロトタイプは毎回新しいインスタンスが必要になる特殊なケースのために予約されています。 Bean のステートフル性とアプリケーション内での Bean の使用方法を慎重に検討することで、情報に基づいた意思決定を行うことができ、より優れた、より保守しやすい Spring アプリケーションを実現することができます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3