SpringBeanのさまざまな範囲を明確に理解しています。しかし、私はエンタープライズ層プロジェクトでBeanのプロトタイプスコープのいくつかのユースケースを探しています。 prototypeスコープ(requestスコープではない)の実際のユースケースを共有できれば素晴らしいと思います。
プロトタイプBeanを使用して、構成済みのフォーム要素(名前、電子メールアドレスなどを検証するように構成されたテキストボックス)を宣言し、Webアプリで作成されるすべてのフォームに対してそれらの「ライブ」インスタンスを取得しました。詳細は重要ではなく、私がこのように要約する原則だけが重要です。
applicationContext.getBean("myBeanConfiguredFancy1")
をファクトリメソッドの一種と考えてください。これにより、xmlで事前構成されたインスタンスが作成されます。以前にSpringSourceで働いていて、このトピックについて開発者と話をしたことがある人として。これが私の見解です。プロトタイプは物事をテストするのに最適です。したがって、プロトタイプという名前は、Springコンテナからリクエストするたびに、Beanの新しいインスタンスを作成するためのcreatenewやその他の説明ではありません。
また、何年にもわたって使用しているうちに、実際の本番アプリケーションでプロトタイプが意味をなす場所は他にありません。オブジェクトが状態を保持している場合、通常はSpringBeanであってはなりません。私が取り組んだすべてのアプリケーションで、すべてのBeanがサービス、リポジトリ、およびシングルトンの非状態保持オブジェクトであり、POJOにはないエンタープライズ機能を提供するトランザクション性、JPA、JMSなどの機能を追加する必要があることがわかりました。持っています。
状態を保持する私のシステム内のオブジェクトは、おそらく私のエンティティとビューDTO、またはSpringBeanであることがまったく意味をなさない他のものです。したがって、本番環境での私のアプリケーションでは、単一の「プロトタイプ」Beanはありませんでした。
私は主に春の_lookup-method
_と組み合わせてプロトタイプを使用しました。私のアプリケーションは ゲームサーバー で、tcpポートで着信バイトをデコードする必要があります。次のBean定義を検討してください
_<bean id="channelBufferProtocol" class="org.menacheri.protocols.impl.ChannelBufferProtocol">
<lookup-method name="createLengthBasedFrameDecoder" bean="lengthFieldBasedFrameDecoder"/>
<property name="eventDecoder" ref="eventDecoder"></property>
<property name="lengthFieldPrepender" ref="lengthFieldPrepender"></property>
<property name="eventEncoder" ref="eventEncoder"></property>
</bean>
_
プロトコル実装クラス内に、フレームデコーダーを作成するための次のコードがありますpipeline.addLast("lengthDecoder", createLengthBasedFrameDecoder());
このメソッドが呼び出されると、springは新しいフレームデコーダーインスタンスを作成して返します。
_bean="lengthFieldBasedFrameDecoder"
_によって返されるBeanは、私のアプリではステートフルBeanであるため、スコープprototype
である必要があります。
注:プロトコルは、一緒にチェーンされたデコーダーとエンコーダーの特定のセットに他なりません。 「ChainofResponsibility」のデザインパターン。
アプリケーションはスレッド/リクエストごとにモデルクラスの異なるインスタンスを必要とするため、モデルクラス(休止状態ではエンティティとも呼ばれます)の場合はプロトタイプスコープを使用できます。