Аннотация Spring ModelAttribute использует отражение для создания объекта команды - PullRequest
2 голосов
/ 13 сентября 2011

После исследования того, как пружина 3 обрабатывает командный объект, я обнаружил, что когда у нас есть метод-обработчик, такой как

    @RequestMapping(method=RequestMethod.POST)
public String create(@ModelAttribute("account") Account account, BindingResult result) {

Spring разрешает объект учетной записи, используя следующую логику

    if (implicitModel.containsKey(name)) {
        bindObject = implicitModel.get(name);
    }
    else if (this.methodResolver.isSessionAttribute(name, paramType)) {
        bindObject = this.sessionAttributeStore.retrieveAttribute(webRequest, name);
        if (bindObject == null) {
            raiseSessionRequiredException(....);
    }
    else {
        bindObject = BeanUtils.instantiateClass(paramType);
    }

Итак, как вы можете видеть, если объект "account" в примере не найден ни в неявной модели, ни в сеансе затем он создает объект команды, используя BeanUtils, который использует медленное отражение. И объект «account» будет в неявной модели только тогда, когда у нас есть метод, подобный следующему.

@ModelAttribute("account")
public Account getAccountObject() {
   return new Account();
}

Но, как правило, и в примере, предоставленном командой Spring, объект создается в обработчике метода GET следующим образом.

@RequestMapping(method=RequestMethod.GET)
    public String getCreateForm(Model model) {
        model.addAttribute(new Account());
        return "account/createForm";
    }

Итак, мы можем видеть, что в общем объект команды создается отражением, которое является медленным. Как лучше всего создавать объекты команд с аннотацией весной 3.x:

1 Ответ

0 голосов
/ 19 октября 2011

Это медленнее , но не обязательно медленно . Платформа Spring широко использует рефлексию, особенно когда она работает с аннотациями (единственный способ узнать, что тип имеет аннотацию). Поэтому неудивительно, что Spring Web MVC использует отражение, как и другие веб-фреймворки Java, такие как Struts 2 (и те, которые используют OGNL в целом), для установки свойств объекта команды.

Дело в том, что эти операции выполняются один раз за HTTP-запрос, и их время в общем случае пренебрежимо мало. Если скорость все еще является проблемой, используйте Apache Tapestry , которая утверждает, что не использует отражение.

Я рекомендую придерживаться того, что Spring предлагает в своих примерах / руководствах (обычно это тот способ, который требует меньше кода).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...