您的位置:首页 > 编程语言 > Java开发

关于spring单例,原型对象模式下犯的错

2016-05-24 22:44 387 查看
众所周知spring的bean管理默认为“单实例”模式,如果想把该bean改为原型模式可以在class文件的头部加上注解:@Scope(“prototype”);

最近犯了一个比较低级的错误,关于spring的bean模式控制的,具体业务逻辑如下:

在一个action层的bean中,定义了一个根据查询条件搜索数据的方法,并将查询结果存放在list中,用于在前台列表中显示,由于数据列表有添加点击列中文本弹出详情页面功能,而且该过程也要调用一遍action方法,为了节省再次访问数据库的成本,将第一次查询出来的结果list,放在一个全局变量中,充当缓存,当前端点击某一行的某一个列中文本时,传一个索引值到后台来(索引值代表点击了第几行的行数,以0起始),根据索引值找出搜索结果全局变量的list的下标索引对应的对象记录。

刚开始没有测试过并发查询情况,测试阶段遇到了,并发查询时,第二个用于的查询结果覆盖了第一个查询结果的bug。因为该action bean的模式默认为“单实例”模式,所以共用了一个全局变量就出现问题。





于是想到了把action bean改为“原型”模式,故添加了注解:@Scope(“prototype”)。结果还是出现了问题。原来“原型”模式下的bean原理为,每发出一个请求该bean对象的方法就会从新构造出一个bean实例,当我第一次调用查询方法得出查询结果并把结果放在一个全局变量list时,以为第二次点击详情链接并传过来下标索引时,可以在查询详情的方法中根据下标索引获取全局变量的对应元素,结果发现全局变量在第二次调用查询详情明细方法时,由于spring重新构造了一个该action的实例对象,所以全局变量是一个空对象。于是,从新改掉了业务代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring prototype