Как Spring MVC обрабатывает несколько пользователей
Я использую spring более 6 месяцев. Я не могу понять этот базовый механизм, связанный с приведенным ниже сценарием.
У меня есть веб-приложение spring. Теперь я смонтировал модель в контроллере. На основе соответствия url он вызывает соответствующий метод. все мои методы однотонные.
Теперь, когда два пользователя открывают приложение одновременно, spring может запускать их параллельно и давать им результаты. Я не понимаю, как это можно сделать. Я имею в виду, что в качестве bean используется односторонний режим, который должен либо ждать, пока bean не будет использоваться, либо не перезапишет данные в bean. Но spring работает правильно. Может кто-то объяснить это поведение с некоторой аналогией.
Чтобы четко объяснить мой вопрос ниже, это фрагмент кода:
Мой контроллер по умолчанию прост:
@Autowired
private AppModel aModel;
public AppModel getModel(){
return aModel;
}
public void setModel(AppModel aModel){
this.aModel = aModel;
}
@RequestMapping(method = RequestMethod.GET)
public ModelAndView defaultGetter(HttpServletRequest request,
HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView(getViewName());
mav.addObject("model", aModel);
Runtime.getRuntime().gc();
return mav;
}
Также может кто-нибудь сказать мне, когда два клиента откроют приложение, будут созданы две отдельные модели, когда я буду использовать @autowired. Если для всех клиентов существует только одна модель bean, тогда скажем, что запрос от клиента 1 пришел, и мне понадобилось 30 секунд, чтобы вернуть результаты. Теперь, если второй клиент отправляет запрос в 3-й секунде, будет ли первый запрос клиентов перезаписан?
Я думаю, что смущаюсь. Может ли кто-нибудь объяснить, как происходит эта магия?
Спасибо
Ответы
Ответ 1
Каждый веб-запрос генерирует новый поток как описанный в этом потоке.
Spring управляет различными областями (прототип, запрос, сеанс, однотонный). Если два одновременных запроса обращаются к singleton bean, то bean должен быть без гражданства (или, по крайней мере, синхронизирован, чтобы избежать проблем). Если вы получите доступ к запросу bean в области видимости, то для каждого запроса будет создан новый экземпляр. Spring управляет этим для вас, но вы должны быть осторожны и использовать правильную область для своего beans. Как правило, ваш контроллер является singleton, но AppModel
должен иметь область request
, иначе у вас будут проблемы с двумя одновременными запросами. Этот поток также может помочь вам.
О вашем последнем вопросе "как эта магия происходит?", ответ "аспект/прокси". Spring создать классы прокси. Вы можете себе представить, что Spring создаст прокси-сервер для вашего класса AppModel
. Как только вы попытаетесь получить доступ к нему в контроллере, Spring переадресует вызов метода в нужный экземпляр.