Springでprototype
スコープを正確に使用する必要があるのはいつですか? Beanが要求された場合、singleton
は同じオブジェクトインスタンスを返すことを理解しました。
では、なぜprototype
を検討する必要があるのでしょうか。
例を使った説明は、その必要性を理解するのに大いに役立ちます。
明確な定義を明確にするために:
プロトタイプスコープ=挿入/ルックアップされるたびに新しいオブジェクトが作成されます。毎回new SomeBean()
を使用します。
シングルトンスコープ=注入/ルックアップされるたびに同じオブジェクトが返されます。ここでは、SomeBean
のインスタンスを1つインスタンス化し、毎回それを返します。
プロトタイプBeanは使用時に作成されます。したがって、ステートフルBeanが必要な場合は、プロトタイプスコープを持つ必要がある場合や、Beanの値をキャッシュしない場合があります。プロトタイプBeanは、1つのセッションまたはいくつかの呼び出しに関連付けることができます。
例:
通常のDAOは会話状態を保持しないため、データアクセスオブジェクト(DAO)は通常プロトタイプとして構成されません。この作成者にとっては、シングルトンダイアグラムのコアを再利用する方が簡単でした。
Scope prototypeを使用することにより、いくつかの興味深いユースケースがあります。たとえば、リアルタイムシステムなど、より優れた信頼性の高いアプリケーション設計/アーキテクチャを構築します。
車両追跡のためのリアルタイムシステムを構築する必要があるとします。5秒ごとに2.000.000台の車が情報を共有します。サーバー側では、2つ以上の異なる構成グループを使用します。 1つはトラック用です。
この単純な例に基づいて、プロトタイプパターンを介してメモリ内の異なる構成グループで動作するようにアプリケーションを設計すると、パフォーマンスが向上します。
したがって、この場合、たとえば、サーバーがトラックから新しいメッセージを受信するたびに、サーバーはメモリ内の構成のインスタンスをVehicleGrupConfigurationのインスタンスのハッシュマップから取得し、構成を適用しますこのメッセージが持っている必要のある振る舞い。例えば、タイムアウト、再試行など。
この状況を実装するには多くの方法があることを強調したいと思いますが、この例は、プロトタイプパターンがパフォーマンスとデザインパターンの点で非常に強力であることを示しています。
ドキュメントに記載されているように、プロトタイプスコープでBean Fooを作成することは、次の呼び出しと同じです。
Foo foo = new Foo(dependency1, dependency2, ...);
foo.initialize(dependency7, dependency8...);
new
の代わりにプロトタイプスコープBeanを使用する唯一の正当な理由は、インスタンスの作成と初期化に使用される依存関係を、新しいインスタンスを必要とするコードの外部に保持する必要がある場合です。
例は、EJB2 Java Entity Beansのような、
Person p = ...
p.setName("John Doe");
p.save(); // write to DB
JPAの方法を使用する代わりに
Person p = new Person();
p.setName("John Doe");
personService.save(p); // write to DB
エンティティBeanのコードスタイルでは、パーソンインスタンスは永続化の方法を知る必要があるため、パーソンを記述するコードが気にする必要のないパーシステンスの詳細を注入する必要があります。
別の例:スレッドセーフではないSimpleDateFormat Javaクラスをアプリケーションの多くの場所で使用し、構成ファイルのフォーマットパターンを使用する場合(他の条件に応じて異なるフォーマットを使用する場合があります)。ファイル(またはSpringプロパティ)からフォーマット文字列もロードするすべての場所で新しいフォーマットインスタンスを作成する代わりに、プロトタイプスコープを使用して、毎回新しいインスタンスを取得し、共通フォーマットの設定の詳細を1つにすることができます。場所。