这就是现在的样子:
@SessionAttributes("shoppingCart")
public class ItemController {
@ModelAttribute
public ShoppingCart createShoppingCart() {
return new ShoppingCart();
}
@RequestMapping(value=RequestMappings.ADD_TO_CART + RequestMappings.PARAM_ITEM_ID, method=RequestMethod.GET)
public String addToCart(@PathVariable("itemId") Item item, @ModelAttribute ShoppingCart shoppingCart) {
if(item != null) {
shoppingCartService.addItem(shoppingCart, item);
}
return ViewNamesHolder.SHOPPING_CART;
}
}
当 addToCart 方法第一次被调用时,shoppingCart 对象会被 createShoppingCart 方法初始化。addToCart 方法运行后,初始化的对象将被添加到会话中,并将从会话中使用以供以后使用。这意味着 createShoppingCart 方法只被调用一次(只要它没有从会话中删除)。
为什么 Spring 通过在需要的时候简单地创建这个对象来消除对 ModelAttribute 带注释的初始化方法的需要?然后它看起来像这样更简单:
@SessionAttributes("shoppingCart")
public class ItemController {
@RequestMapping(value=RequestMappings.ADD_TO_CART + RequestMappings.PARAM_ITEM_ID, method=RequestMethod.GET)
public String addToCart(@PathVariable("itemId") Item item, @ModelAttribute ShoppingCart shoppingCart) {
if(item != null) {
shoppingCartService.addItem(shoppingCart, item);
}
return ViewNamesHolder.SHOPPING_CART;
}
}
每当在会话中找不到 shoppingCart 对象时,它将由其默认构造函数初始化。您认为做出该决定的原因是什么?