在调查了弹簧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”obejct才会在隐式模型中。
@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";
}
所以我们可以看到,通常命令对象是由反射创建的,这是很慢的。 在spring 3.x中使用注释创建命令对象的最佳做法是什么:
答案 0 :(得分:0)
较慢,但不一定慢。 Spring框架广泛使用反射,特别是当它使用注释时(唯一的方法是找出类型上有注释)。因此,Spring Web MVC就像其他Java Web框架(如Struts 2(以及一般使用OGNL)那样使用反射来设置命令对象属性也就不足为奇了。
事情是 - 每个HTTP请求执行一次这些操作,并且它们的时间通常可以忽略不计。如果速度仍然是问题,请使用Apache Tapestry,声称不使用反射。
我建议你坚持Spring在其示例/教程中提出的方式(通常,这是需要较少代码的方式)。