关于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的模式默认为“单实例”模式,所以共用了一个全局变量就出现问题。
![](https://img-blog.csdn.net/20160524223129064)
![](https://img-blog.csdn.net/20160524223159009)
于是想到了把action bean改为“原型”模式,故添加了注解:@Scope(“prototype”)。结果还是出现了问题。原来“原型”模式下的bean原理为,每发出一个请求该bean对象的方法就会从新构造出一个bean实例,当我第一次调用查询方法得出查询结果并把结果放在一个全局变量list时,以为第二次点击详情链接并传过来下标索引时,可以在查询详情的方法中根据下标索引获取全局变量的对应元素,结果发现全局变量在第二次调用查询详情明细方法时,由于spring重新构造了一个该action的实例对象,所以全局变量是一个空对象。于是,从新改掉了业务代码。
最近犯了一个比较低级的错误,关于spring的bean模式控制的,具体业务逻辑如下:
在一个action层的bean中,定义了一个根据查询条件搜索数据的方法,并将查询结果存放在list中,用于在前台列表中显示,由于数据列表有添加点击列中文本弹出详情页面功能,而且该过程也要调用一遍action方法,为了节省再次访问数据库的成本,将第一次查询出来的结果list,放在一个全局变量中,充当缓存,当前端点击某一行的某一个列中文本时,传一个索引值到后台来(索引值代表点击了第几行的行数,以0起始),根据索引值找出搜索结果全局变量的list的下标索引对应的对象记录。
刚开始没有测试过并发查询情况,测试阶段遇到了,并发查询时,第二个用于的查询结果覆盖了第一个查询结果的bug。因为该action bean的模式默认为“单实例”模式,所以共用了一个全局变量就出现问题。
于是想到了把action bean改为“原型”模式,故添加了注解:@Scope(“prototype”)。结果还是出现了问题。原来“原型”模式下的bean原理为,每发出一个请求该bean对象的方法就会从新构造出一个bean实例,当我第一次调用查询方法得出查询结果并把结果放在一个全局变量list时,以为第二次点击详情链接并传过来下标索引时,可以在查询详情的方法中根据下标索引获取全局变量的对应元素,结果发现全局变量在第二次调用查询详情明细方法时,由于spring重新构造了一个该action的实例对象,所以全局变量是一个空对象。于是,从新改掉了业务代码。
相关文章推荐
- 一个jar包里的网站
- 一个jar包里的网站之文件上传
- 一个jar包里的网站之返回对媒体类型
- Spring和ThreadLocal
- Spring Boot 开发微服务
- Spring整合Quartz(JobDetailBean方式)
- Spring整合Quartz(JobDetailBean方式)
- prototype Element学习笔记(篇一)
- Prototype 学习 工具函数学习($方法)
- Prototype使用指南之selector.js说明
- prototype1.4中文手册
- prototype 1.5相关知识及他人笔记
- prototype Element学习笔记(Element篇三)
- prototype Element学习笔记(篇二)
- prototype 的说明 js类
- Prototype 学习 工具函数学习($A方法)
- Prototype源码浅析 String部分(三)之HTML字符串处理
- javascript prototype,executing,context,closure
- prototype 1.5 & scriptaculous 1.6.1 学习笔记