【问题标题】:spring wiring, singleton versus prototype弹簧接线,单例与原型
【发布时间】:2010-01-01 17:50:16
【问题描述】:

刚刚阅读spring,并且在spring中使用DI时,如果您将bean设置为单例(默认),那么该类的单个实例将被“分配”,而原型每次都会强制一个新实例.

容器每次分配同一个实例的后果是什么? 这是否意味着会有共享状态?

即如果实例在某处被修改,所有未来的对象创建实际上都会得到一个“脏”对象而不是一个“新”对象?

【问题讨论】:

    标签: java spring dependency-injection


    【解决方案1】:

    由于您通常使用 Spring 对接口进行编程,因此 DI 管理的对象无需担心状态。在这种情况下,无需担心“脏”。存储库、服务、控制器 - 所有这些都应该很少或根本没有状态可言。

    【讨论】:

    • 所以你说 POJO 类并不真正关心状态,它们只是被传递?但是你不要说一个用户对象,然后设置它的属性,然后持久化它。如果它是单例(默认),设置用户名不会影响所有其他实例吗?
    • 不,如果您创建一个用户对象并将其持久化,您调用 new 来创建它并保存以将其作为事务的一部分放入数据库中。当超出范围时,用户引用可能会或可能不会被 GC。这不在 Spring 的控制之下。您不会像执行服务或 DAO 那样进行配置。
    • 啊好的,24 小时后阅读您所写的内容很有意义。你不用 DI 设置 POJO ......
    【解决方案2】:

    如果您将 Spring 管理的 bean 的范围声明为单例,是的,会有共享状态。通常,您不会像在制作 servlet 时那样避免使用不适当的实例变量。但是控制器的状态会包括它调用的服务,服务的状态会包括对它使用的数据访问对象的引用。

    【讨论】:

      【解决方案3】:

      单例对象就是这样。每个注入了单例的对象都会获得对相同对象的引用。该对象的任何更改都将对该对象的所有消费者可见(通过行为或其他方式)。

      【讨论】:

        【解决方案4】:

        除非您使用某种同步,否则您绝对应该避免在单例会话 bean 中维护状态。理想情况下,单例不应该有实例字段。当您需要以会话方式维护状态时,请使用有状态 bean。当您使用完有状态 bean 后,您必须显式删除它,否则您会遇到内存泄漏。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-10-16
          • 2012-03-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-12
          相关资源
          最近更新 更多