一个单例 bean 怎样能用于无状态会话?

3

大家早上好。今天早上,我在阅读Spring参考指南时发现了以下声明:

As a rule, use the prototype scope for all stateful beans and the singleton
scope for stateless beans.

当bean作用域为“prototype”时,Context.getBean(...)将始终返回一个新实例化的对象。那么我们如何实现有状态特性呢?在这里我该如何维护对话?

类似地,“singleton”每个容器只会创建一次。因此,在多个请求之间,它保存相同的数据集(如果我们讲得更准确,是上次状态)。那么,spring参考文档中的上述语句到底是什么意思?我很困惑。请帮我理解一下这个声明。我可能有误解。

2个回答

0
在我们的CRUD应用程序中,Spring DAO是一个单例。也就是说,只有jdbc模板初始化是类级变量。其他逻辑都是方法调用的一部分。因此,实际上状态是堆栈帧的一部分,而不是堆,因此它是线程安全的。

0

这样想:

假设你有一个豆子 - 比如一个服务 - 它通过一些私有字段来保存复杂调用的状态(可能还包括对其他组件的调用),如果两个调用同时发生在该豆子/服务上,那么状态就会受到损害,因为成员字段无法处理两个并发调用的状态。如果你想要保存两个并发调用的状态,你可能需要将状态存储在某种映射中,其中键是线程ID。

然而,如果你使用原型豆子,每个请求/调用都会创建一个新的豆子(例如服务),并且状态可以安全地存储在豆子的私有字段中,因为豆子不会在不同的请求之间共享。

请注意,如果你想在多个请求之间保持状态(例如会话状态或类似状态),则最好的方法可能是将状态保存在某种状态存储中(例如具有Map的单例豆子,甚至更好的是基于EhCache等缓存)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接