Пишу веб-приложение в учебных целях в котором присутствует авторизация пользователей, и далее, для авторизованного пользователя доступна некоторая логика (добавлять элементы, удалять их из обычного List).
Использую Spring fraemwork и аннотацию Controller для создания, непосредственно, контроллеров. Вопрос в следующем:
Если сразу несколько пользователей обращаются к моему сервису, то как происходит обработка этих запросов контроллером? На каждого пользователя создается свой контроллер, и то есть для каждого пользователя будет создан уникальный ArrayList и доступа к нему (изменению) у других пользователей не будет? (Понимаю, что маловероятно, потому что для большого количества пользователей не хватит никакой оперативной памяти)
Или же один контроллер может обрабатывать сразу запросы нескольких пользователей? И тогда несколько пользователей будут редактировать один и тот же объект? И если так, то как в этом случае лучше поступить? Создавать Map>? Или есть другие более правильные способы?
В интернете особо информации по этому вопросу не нашел.
Как я понимаю из вашего вопроса вы интересуетесь тем можно хранить какую либо информацию (состояние) для каждого пользователя отдельно.
По умолчанию все компоненты (@Controller/@Service/@Component) являются Singleton и при обращении к ним создаются в единственном экземпляре. И все запросы пользователей будут адресоваться к экземплярам одного и того же объекта.
Однако объекты модели с которыми взаимодействуют контроллеры вполне могут быть уникальными для каждого пользователя так как в Spring есть штатная возможность работы на уровне сессий. Для этого можно обратится к аннотации @SessionAttributes. Пример использования можно посмотреть здесь.
В этом случае вам не придется создавать по контроллеру на каждого пользователя, а объекты будут привязаны к сессии - то есть будут уничтожены итерацией gc после завершения сессии то есть их время жизни более менее будет сопоставимо с самой сессией.
По умолчанию в Spring все компоненты синглетоны - классы имею единственный экземпляр в течении всей жизни программы и загружаются они во время запуска приложения. Поэтому по умолчанию единственный экземпляр компонента обрабатывает запросы от всех пользователей. Можно задать компоненту @Scope("prototype"), тогда при каждом обращении будет создаваться новый экземпляр компонента.
Через компоненты вы редактируете сущности а не компоненты. Два пользователя не должны редактировать одну сущность - это больше вопрос к уровням изоляции транзакций.
Возможно не совсем понятен ваш вопрос. Какую конкретную задачу вы хотите решить?
Сборка персонального компьютера от Artline: умный выбор для современных пользователей