我发现我最初的努力是为了理解@ModelAttribute是Spring决定将多个注释合并为一个的结果。当我将它分成几个较小的注释时,它变得更清晰了:
对于参数注释,请考虑@ModelAttribute相当于@Autowired + @Qualifier也就是说,它试图从Spring托管模型中检索具有给定名称的bean。如果找不到命名bean,而不是抛出错误或返回null,它隐式地承担了@Bean也就是说,使用默认构造函数创建一个新实例,并将bean添加到模型中。
对于方法注释,请考虑@ModelAttribute相当于@Bean + @Before,也就是说,它将用户代码构造的bean放在模型中,并且它总是在请求处理方法之前被调用。
比方说,我看到了@ModelAttribute如下所示(请不要照本宣科!):
@Bean(“person”) @Before public Person createPerson(){
return new Person();} @RequestMapping(…) public xxx handlePersonRequest( (@Autowired @Qualifier(“person”) |
@Bean(“person”)) Person person, xxx){
…}
如你所见,Spring做出了正确的决定@ModelAttribute一个包罗万象的注释;没有人想看到一个注释。