学习spring框架时,总是不能理解action为什么要加上scope=prototype,也就是为什么要多例,单例不行吗?
所以,做项目的时候也没怎么注意,有时候忘记写prototype,对功能也没什么影响。直到遇到两次错误,我才理解多例的重要性。
1. 在进行图片上传时,给出uploadLogo属性接收前台传递过来的数据,第一次上传图片正常保存,第二次没上传图片却保存第一次上传的图片,我当时就想:应该是uploadLogo缓存了上次的记录,只要用完清空就好了,也解决了问题。
private File uploadLogo; // 上传的文件
public void setUploadLogo(File uploadLogo) {
this.uploadLogo = uploadLogo;
}
2. 用JPA保存实体时,第一次正常保存,第二次报如下错误,一开始以为是主键生成策略的问题,后来加了prototype,问题就解决了。
org.hibernate.PersistentObjectException: detached entity passed to persist
总结,prototype的作用是:每次访问action时,新实例化一个action,也就是说,action里面的值都清空了,不会受到上一个action的影响。