【发布时间】:2010-01-01 17:50:16
【问题描述】:
刚刚阅读spring,并且在spring中使用DI时,如果您将bean设置为单例(默认),那么该类的单个实例将被“分配”,而原型每次都会强制一个新实例.
容器每次分配同一个实例的后果是什么? 这是否意味着会有共享状态?
即如果实例在某处被修改,所有未来的对象创建实际上都会得到一个“脏”对象而不是一个“新”对象?
【问题讨论】:
标签: java spring dependency-injection
刚刚阅读spring,并且在spring中使用DI时,如果您将bean设置为单例(默认),那么该类的单个实例将被“分配”,而原型每次都会强制一个新实例.
容器每次分配同一个实例的后果是什么? 这是否意味着会有共享状态?
即如果实例在某处被修改,所有未来的对象创建实际上都会得到一个“脏”对象而不是一个“新”对象?
【问题讨论】:
标签: java spring dependency-injection
由于您通常使用 Spring 对接口进行编程,因此 DI 管理的对象无需担心状态。在这种情况下,无需担心“脏”。存储库、服务、控制器 - 所有这些都应该很少或根本没有状态可言。
【讨论】:
如果您将 Spring 管理的 bean 的范围声明为单例,是的,会有共享状态。通常,您不会像在制作 servlet 时那样避免使用不适当的实例变量。但是控制器的状态会包括它调用的服务,服务的状态会包括对它使用的数据访问对象的引用。
【讨论】:
单例对象就是这样。每个注入了单例的对象都会获得对相同对象的引用。该对象的任何更改都将对该对象的所有消费者可见(通过行为或其他方式)。
【讨论】:
除非您使用某种同步,否则您绝对应该避免在单例会话 bean 中维护状态。理想情况下,单例不应该有实例字段。当您需要以会话方式维护状态时,请使用有状态 bean。当您使用完有状态 bean 后,您必须显式删除它,否则您会遇到内存泄漏。
【讨论】: