@Controller Spring для множества пользователей

219
17 января 2022, 09:10

Пишу веб-приложение в учебных целях в котором присутствует авторизация пользователей, и далее, для авторизованного пользователя доступна некоторая логика (добавлять элементы, удалять их из обычного List).

Использую Spring fraemwork и аннотацию Controller для создания, непосредственно, контроллеров. Вопрос в следующем:

Если сразу несколько пользователей обращаются к моему сервису, то как происходит обработка этих запросов контроллером? На каждого пользователя создается свой контроллер, и то есть для каждого пользователя будет создан уникальный ArrayList и доступа к нему (изменению) у других пользователей не будет? (Понимаю, что маловероятно, потому что для большого количества пользователей не хватит никакой оперативной памяти)

Или же один контроллер может обрабатывать сразу запросы нескольких пользователей? И тогда несколько пользователей будут редактировать один и тот же объект? И если так, то как в этом случае лучше поступить? Создавать Map>? Или есть другие более правильные способы?

В интернете особо информации по этому вопросу не нашел.

Answer 1

Как я понимаю из вашего вопроса вы интересуетесь тем можно хранить какую либо информацию (состояние) для каждого пользователя отдельно.

По умолчанию все компоненты (@Controller/@Service/@Component) являются Singleton и при обращении к ним создаются в единственном экземпляре. И все запросы пользователей будут адресоваться к экземплярам одного и того же объекта.

Однако объекты модели с которыми взаимодействуют контроллеры вполне могут быть уникальными для каждого пользователя так как в Spring есть штатная возможность работы на уровне сессий. Для этого можно обратится к аннотации @SessionAttributes. Пример использования можно посмотреть здесь.

В этом случае вам не придется создавать по контроллеру на каждого пользователя, а объекты будут привязаны к сессии - то есть будут уничтожены итерацией gc после завершения сессии то есть их время жизни более менее будет сопоставимо с самой сессией.

Answer 2

По умолчанию в Spring все компоненты синглетоны - классы имею единственный экземпляр в течении всей жизни программы и загружаются они во время запуска приложения. Поэтому по умолчанию единственный экземпляр компонента обрабатывает запросы от всех пользователей. Можно задать компоненту @Scope("prototype"), тогда при каждом обращении будет создаваться новый экземпляр компонента.

Через компоненты вы редактируете сущности а не компоненты. Два пользователя не должны редактировать одну сущность - это больше вопрос к уровням изоляции транзакций.

Возможно не совсем понятен ваш вопрос. Какую конкретную задачу вы хотите решить?

READ ALSO
Адаптация под мобильное устройство с разрешением экрана как у ПК

Адаптация под мобильное устройство с разрешением экрана как у ПК

Народ, всем привет, кто нашел время и желание отозваться! Сделал адаптацию сайта под различные устройства через @media min-width и max-width (от 0 до 560px)...

180
bootstrap перекрывает стили css

bootstrap перекрывает стили css

Доброго времени суток друзьяВ проекте имплементированная библиотека стилей Bootstrap перекрывает стили css прописанные в ручную

94
При создании объекта с помощью оператора new не срабатывает деструктор

При создании объекта с помощью оператора new не срабатывает деструктор

В этом коде, я присваиваю указателю current адрес в памяти, на который указывает указатель, который возвращает функция listen_port, и передаю current в функцию,...

101