/ / Анотація Spring ModelAttribute використовує відображення для створення командного об'єкта - spring, spring-mvc

Анотація Spring ModelAttribute використовує відображення для створення командного об'єкта - spring, spring-mvc

Після дослідження того, як spring 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);
}

Отже, як ви можете бачити, чи є "рахунок" об'єктом у прикладіне зустрічається ні в неявній моделі, ні в сесії тоді він створює командний об'єкт за допомогою BeanUtils, який використовує повільне відображення. І об'єкт "облікового запису" буде в неявній моделі лише тоді, коли у нас є такий метод, як наступний.

@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:

Відповіді:

0 для відповіді № 1

це є повільніше, але не обов'язково повільно. Spring framework широко використовує рефлексію,особливо коли це працює з анотаціями (єдиний спосіб з’ясувати, що тип має анотацію). Тож не дивно, що Spring Web MVC використовує відображення так само, як інші веб-фреймворки Java, такі як Struts 2 (і ті, що використовують OGNL загалом) для встановлення властивостей командного об'єкта.

Річ у тім, що ці операції виконуються один раз за HTTP-запитом, і їхній час загалом нехтувати. Якщо швидкість все ще залишається проблемою, використовуйте Шпалер Apache, який стверджує, що не використовує рефлексію.

Я рекомендую вам дотримуватися того, як пропонує Spring у своїх прикладах / підручниках (зазвичай це шлях, який вимагає менше коду).