Подтвердить что ты не робот

Область действия Spring -Controller и его экземпляров-переменных

Являются ли все контроллеры в синглонах Spring -MVC и разделены между различными сеансами и запросами?

Если это так, я предполагаю, что переменная класса, подобная

public String name;

будет одинаковым для всех запросов и сеансов? Итак, если пользователь X делает запрос и name устанавливается в Paul, пользователь Z также имеет атрибут Paul в качестве атрибута?

В моем случае я НЕ хочу этого поведения, но задаюсь вопросом, есть ли более простой или более чистый OOP-способ иметь переменные session/request, а затем session.getAttribute()/request.getAttribute()

4b9b3361

Ответ 1

Чтобы ответить на ваш первый вопрос: да, Spring Контроллеры MVC по умолчанию являются одиночными. Поле объекта будет общим и видимым для всех запросов и всех сеансов навсегда.

Однако без какой-либо синхронизации вы можете столкнуться со всеми типами проблем concurrency (условия гонки, видимость). Таким образом, ваше поле должно иметь модификатор volatileprivate, кстати), чтобы избежать проблем с видимостью.

Вернуться к основному вопросу: в 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>

Ответ 2

Да, контроллеры в Spring -MVC являются одиночными. Между несколькими запросами ваша переменная класса получает общий доступ и может привести к двусмысленности. Вы можете использовать аннотацию @Scope ( "запрос" ) над вашим контроллером, чтобы избежать такой двусмысленности.