После исследования того, как пружина 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: