1

@Autowiredは1回だけ機能します。

サーブレットが再作成されるたびにBeanをワイヤリングするにはどうすればよいですか?

私のWebアプリ(Tomcat6コンテナ)は2つのサーブレットで構成されています。すべてのサーブレットにはプライベートフィールドがあります。

彼らのセッターは@Autowiredでマークされています

initメソッドで使用します

WebApplicationContextUtils
..。
autowireBean(this);

サーブレットの初期化中に、 @Autowiredでマークされたプロパティを一度自動配線します。

他のセッションにはこれらのフィールド値が表示され、前のセッションが破棄された後は再配線されません。

サーブレットコンストラクターが呼び出されるたびにそれらを再配線させるにはどうすればよいですか?

a)自動配線をコンストラクターに入れますか?

または、2)Webアプリのコンテキストを取得し、そこからBeanを抽出しますか?

4

3 に答える 3

1

そのBeanのプロトタイプとしてスコープを使用してみてください@Scope("prototype")

于 2010-05-07T14:51:00.633 に答える
1

コンテナがどのように機能するかについて、いくつかの誤解があるようです。サーブレットは基本的にシングルトンであり、誰かがサーバーを呼び出すたびに新しいサーブレットを取得するわけではありません。サーブレットのプライベートフィールドに状態を保存することは、ほとんどエラーです。

リクエスト処理のステートフル部分の範囲とライフサイクルは何ですか?リクエストの存続期間だけであれば、サーブレットのステートフルなものをすべて取得して、別のクラスに移動できます。次に、そのクラスのプロトタイプBeanを定義し、リクエストの開始時にgetBeanを使用して新しいBeanを取得できます。ファンシーになりたい場合は、各リクエストの開始時に新しいBeanをThreadLocalに配置するフィルターを作成できます。

状態が複数のリクエストにまたがる必要がある場合は、状態またはWebセッション上の状態ストレージを指すキーの保持を開始するか、会話フレームワークの使用を検討する必要があります。

于 2010-05-07T16:33:50.367 に答える
-1

@Scope( "session")を使用してみてください

于 2011-06-29T09:06:50.540 に答える