59

Spring 3 MVC について質問があります@Controllers。リクエストが来ると、コンテナはリクエストごとにコントローラーの新しいインスタンスを作成しますか (Struts 2 のアクションと同様- ThreadLocal ActionContext)、または単一のインスタンスがすべてのリクエストに応答しますか? デフォルトでは、コントローラー Bean はコンテキスト内のシングルトンですか?

Spring 3 MVC アプリケーションのガイドライン/ベスト プラクティスは何ですか? これらの設定は構成可能ですか? それらを構成する必要がありますか?私の環境がクラスター化された環境である場合、それは大きく変わりますか-jvm /コンテナーが異なるため、そうすべきではないと思いますが、信頼できる提案を歓迎します.

Spring のドキュメントを読みましたが、おそらく見逃していました。「これが私たちが実装した方法です」という回答/ポインタ/リンクは役に立ちます ありがとう。

4

4 に答える 4

66

Spring コントローラーは、サーブレットと同様にシングルトンです (Web アプリケーションごとに各コントローラーのインスタンスが 1 つだけ存在します)。通常、この動作を変更しても意味がありません (可能であれば)。一般的な落とし穴については、サーブレットのスレッド セーフについてを参照してください。コントローラーにも適用されます。

アプリケーションがクラスター化されている場合は、状態を回避するためにできる限りのことを行います。コントローラーの状態は、スレッド化の問題を回避するために同期を必要とします。また、おそらくその状態をサーバー間で複製することになります-非常に高価で面倒です.

于 2012-07-16T16:22:52.837 に答える
2

コントローラーはシングルトンであるため、webapp が同時に多くのリクエストを処理する場合、キーワード new によって多くのインスタンスを作成することを避けることができます。コントローラー シングルトンを使用すると、若い GC を減らすことによって JVM の負担を軽減することもできます。

于 2015-03-13T13:56:34.097 に答える
2

Struts2 アクションは状態を保持するため、シングルトンではありません。Struts2 は、アクション自体の javabeans プロパティを利用して、着信要求データを運び、フレームワークのさまざまな層に公開します。

一方、Spring はコントローラーに渡されるモデル オブジェクトを使用します。コントローラー自体は状態を保持しないため、シングルトンは理にかなっています。

于 2013-12-24T16:51:56.587 に答える