Ответ 1
Чтобы ответить на ваш первый вопрос: да, Spring Контроллеры MVC по умолчанию являются одиночными. Поле объекта будет общим и видимым для всех запросов и всех сеансов навсегда.
Однако без какой-либо синхронизации вы можете столкнуться со всеми типами проблем concurrency (условия гонки, видимость). Таким образом, ваше поле должно иметь модификатор volatile
(и private
, кстати), чтобы избежать проблем с видимостью.
Вернуться к основному вопросу: в Spring вы можете использовать request- (см. 4.5.4.2 область запроса) и область сеанса (см.: 4.5.4.3 Область сеанса) beans. Вы можете вводить их контроллерам и любым другим beans (даже синглотам!), Но Spring гарантирует, что каждый запрос/сеанс имеет независимый экземпляр.
Единственное, что следует помнить при введении в одиночные пакеты с запросом и сеансом beans, - это обернуть их в облачный прокси (пример из 4.5.4.5 Scoped beans в качестве зависимостей):
<!-- 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>