spring - Spring singleton bean 的值与用户共享
问题描述
我有一个具有以下 bean 的 Spring webapp。当 2 个用户同时进入系统时,两个用户都获得相同的服务,而它应该显示每个用户自己的服务。不应该混淆。
如何在当前代码中执行此操作?CommonWSServiceClass 默认是单例范围。
我可以删除实例字段
private List<Services> exSVCList = null;
并使其成为本地方法(在retrieveExistingService() 方法中声明它)。通过这种方式,我相信它在某种程度上解决了这个问题。但请参阅下面的问题。将上述变量设置为方法本地后,如果两个用户同时来会发生什么。两个线程都在方法retrieveExistingService() 中,但user_1
return exSVCList;
在线。正要退出该方法。但是 user_2 来执行相同的方法 lineexSVCList = new ArrayList();
。所以在这种情况下,当 user_1 完成方法retrieveExistingService() 的执行时,他会得到一个空的arrayList,不是吗?由于 bean 是单例的,因此那里只有一个 bean。所以arraylist的大小是空的。因为 user_2 更新了相同的变量。
我的理解正确吗?如果是这种情况,如何在 Spring 中处理这个问题?
@Component
@Scope(value = "session")
public class ServiceClass {
@Autowired
private CommonWSServiceClass webservices;
public services[] getExServices(){
List<Services> list = webservices.retrieveExistingService()
}
}
@Service
public class CommonWSServiceClass {
private List<Services> exSVCList = null;
public List<Services> retrieveExistingService() {
exSVCList = new ArrayList();
exSVCList.add(addSomeObj);
updateList();
exSVCList.add(addAnotherObj);
return exSVCList;
}
private void updateList() {
exSVCList.add(Call a Webservice to get the item list.);
}
}
解决方案
单例必须是无状态的,因此删除状态(私有列表 exSVCList = null)并将其定义为方法变量。如果您需要存储每个连接用户的状态,它应该作为属性进入其会话
推荐阅读
- python - 我可以使用列表元素作为变量吗?
- php - 如何处理文件服务器竞争条件?
- html - 将我的网站布局居中不适用于 margin: auto
- speech-recognition - 检测语音结束 Asterisk 13
- docker - Docker - 使用 docker-compose 挂载主机卷的 nginx 挂起
- python - 将 Python 2.7 更新到 Python 3 后,Sublime 将无法识别以前导入的模块
- java - Springboot 单元测试动态设置@Configuration Properties
- c# - 如何从多个类c#返回
- javascript - 如何在 Electron js 中将消息打印到 openDevTools 的控制台?
- sql-server - SQL 查询 - 值不能与前一行相同