Как 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 переадресует вызов метода в нужный экземпляр.