最初の質問に答えるには:はい、SpringMVCコントローラーはデフォルトでシングルトンです。オブジェクトフィールドは共有され、すべてのリクエストとすべてのセッションで永久に表示されます。
ただし、同期がないと、あらゆる種類の同時実行の問題(競合状態、可視性)が発生する可能性があります。したがって、可視性の問題を回避するために、フィールドにはvolatile
(そしてprivate
、ちなみに)修飾子が必要です。
主な質問に戻ります。Springでは、request-( 4.5.4.2 Request scopeを参照)およびsession- scoped(4.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>