Spring ModelAttribute注释使用反射来创建命令对象

时间:2011-09-13 13:21:27

标签: spring spring-mvc

在调查了弹簧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中使用注释创建命令对象的最佳做法是什么:

1 个答案:

答案 0 :(得分:0)

较慢,但不一定。 Spring框架广泛使用反射,特别是当它使用注释时(唯一的方法是找出类型上有注释)。因此,Spring Web MVC就像其他Java Web框架(如Struts 2(以及一般使用OGNL)那样使用反射来设置命令对象属性也就不足为奇了。

事情是 - 每个HTTP请求执行一次这些操作,并且它们的时间通常可以忽略不计。如果速度仍然是问题,请使用Apache Tapestry,声称不使用反射。

我建议你坚持Spring在其示例/教程中提出的方式(通常,这是需要较少代码的方式)。