早上好。今天早上,当我通过Spring参考指南时,我遇到了以下声明
As a rule, use the prototype scope for all stateful beans and the singleton
scope for stateless beans.
当bean范围是“prototype”时,Context.getBean(...)将始终返回一个新实例化的对象。那我们怎么能实现有状态的功能呢?我怎么能在这里保持对话?
类似地,每个容器只创建一次“singleton”。因此,在多个请求中,它保存相同的数据集(我的意思是如果我们说得更准确,则为最后状态)。然后从春季参考文件中得到的所有关于上述陈述的内容。我很困惑。请帮助我理解声明?我的理解可能不对。
答案 0 :(得分:0)
在我们的CRUD应用程序中,Spring DAO是一个单例。也就是说,只有jdbc模板初始化是类级变量。另一个逻辑是方法调用的所有部分。因此,实际上,状态是堆栈帧的一部分而不是堆,因此它是线程安全的。
答案 1 :(得分:0)
这样想:
想象一下你有一个豆 - 例如服务 - 通过某些私有字段保存复杂调用的状态(并可能调用服务使用的其他组件)。如果两个调用同时发生在该bean /服务上,则状态会受到影响,因为成员字段无法处理两个同时调用的状态。如果你想保持两个同时调用的状态,你可能需要将状态存储在某个地图中,其中密钥是例如线程ID。
但是,如果使用原型bean,则会为每个请求/调用创建一个新bean(示例中的服务),并且状态可以安全地存储在bean的私有字段中,因为不会在不同的请求之间共享bean。
请注意,如果要在多个请求之间保持状态(如会话状态或类似状态),那么可能要将状态保存在某种状态存储中(例如单例)带有Map的bean,甚至更好的基于例如EhCache的缓存。