46

すべてのコントローラーはSpring-MVCシングルトンであり、異なるセッションやリクエスト間で共有されていますか?

もしそうなら、私は次のようなクラス変数を仮定します

public String name;

すべてのリクエストとセッションで同じでしょうか?したがって、ユーザーXがリクエストを行い、Paulnameに設定されている場合、ユーザーZも属性としてPaulを持ちますか?

私の場合、私はその振る舞いを望んでいませんが、セッション/リクエスト変数を持っているより簡単な、またはよりクリーンなOOP方法があるかどうか疑問に思いましたsession.getAttribute()/request.getAttribute()

4

2 に答える 2

71

最初の質問に答えるには:はい、SpringMVCコントローラーはデフォルトでシングルトンです。オブジェクトフィールドは共有され、すべてのリクエストとすべてのセッションで永久に表示されます。

ただし、同期がないと、あらゆる種類の同時実行の問題(競合状態、可視性)が発生する可能性があります。したがって、可視性の問題を回避するために、フィールドにはvolatile(そしてprivate、ちなみに)修飾子が必要です。

主な質問に戻ります。Springでは、request-( 4.5.4.2 Request scopeを参照)およびsession- scoped4.5.4.3 Session scopeを参照)Beanを使用できます。それらをコントローラーやその他のBean(シングルトンでも!)に注入できますが、Springは各リクエスト/セッションに独立したインスタンスがあることを確認します。

リクエストスコープとセッションスコープのBeanをシングルトンに注入するときに覚えておくべきことは、スコープ付きプロキシでラップすることだけです(4.5.4.5スコープ付きBeanを依存関係として取得した例)。

<!-- an HTTP Session-scoped bean exposed as a proxy -->
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session">

    <!-- instructs the container to proxy the surrounding bean -->
    <aop:scoped-proxy/>
</bean>
于 2012-06-21T14:12:29.823 に答える
13

はい、Spring-MVC のコントローラーはシングルトンです。複数のリクエスト間でクラス変数が共有され、あいまいになる可能性があります。@Scope("request")このようなあいまいさを避けるために、コントローラーの上に注釈を使用できます。

于 2015-06-25T04:00:41.330 に答える