デフォルトでは、Spring によって作成される Bean はシングルトンです。それらはステートレスであるため、スレッドセーフです。Spring にステートフル Bean を作成させたい場合、Bean 定義にプロトタイプ スコープを使用する必要があります。それらのスレッドセーフの問題に対処する必要があります。すべてのステートレス Bean は、プロトタイプ Bean によって注入されると汚染されます。というわけで、プロトタイプのスコープをどこで使えるかイメージできません。プロトタイプSpring Beanを使用できる/使用する必要がある典型的なシナリオをいくつか挙げていただけますか? また、他のシングルトン Bean のステートフルな汚染をどのように無効にできますか?
2 に答える
プロトタイプ スコープを使用する理由は多数あります。たとえば、シングルトンを使用する代わりに「new」を使用する場合などです。ユーザーごとの Bean、リクエストごとの Bean、ユニークな Bean のコレクションなど。
シングルトン スコープの Bean は、単にシングルトンであるため、スレッド セーフではありません。スレッド セーフになるように記述する必要があります。それらは魔法のようにスレッドセーフにはなりません。Bean のスコープは、まさにそのスコープです。Beanを特定のスコープに適したものにするわけではありません。それは開発者次第です。
オブジェクトの作成に使用されるファクトリ クラスの代替として、プロトタイプ スコープ Bean を認識しています。違いは、プロトタイプ Bean の場合です。Spring は、依存性注入のためのコードを節約し、必要に応じてトランザクションなどのためにオブジェクトを自動的にプロキシします。
私自身は工場アプローチを好みます。私が遭遇したプロトタイプ スコープの妥当なシナリオの 1 つは、ステートフル オブジェクトであり、さまざまな既知の Bean で必要とされ、それぞれが独自のコピーを必要としていました。オブジェクトをオンザフライで作成する必要はなく、他の Bean のインスタンス化中にのみ作成する必要があったため、このシナリオでは専用のファクトリ クラスは冗長です。