【问题标题】:Should service layer classes be singletons?服务层类应该是单例吗?
【发布时间】:2011-01-11 11:52:18
【问题描述】:

我正在使用 Spring 框架。我的服务类应该创建为单例吗?有人可以解释为什么或为什么不?谢谢!

【问题讨论】:

    标签: spring n-tier-architecture


    【解决方案1】:

    是的,它们应该在singleton 范围内。 服务应该是无状态的,因此它们不需要多个实例。

    因此在singleton 范围内定义它们将节省实例化和连接它们的时间。

    singleton 是 spring 中的默认作用域,因此只需保持 bean 定义不变,无需显式指定 scope 属性。

    您可以阅读有关范围的更多信息in the spring docs

    【讨论】:

    • 谢谢。我是 Spring 新手,我知道如何编写单例类,但是如何使用 Spring 设置“单例范围”?
    • 哦,我没有看到您关于它是默认范围的评论。您能否向我解释一下这个范围是在哪里设置和配置的,这样我就可以了解所有东西是如何连接的?再次感谢。
    • 我将链接添加到我的答案中。
    • 谢谢!很高兴知道我不必进行任何更改!
    • @Bozho 如果您需要在单例 Spring 服务中使用状态/实例变量,是否有任何缺点或更好的方法:stackoverflow.com/q/11126684/106261
    【解决方案2】:

    如果您坚持使用单例范围的 bean,那么 Spring 会更容易使用。如果您愿意,单例是它的“默认位置”。是的,它支持其他作用域(在 XML 文件中使用 scope="xyz"),但它使事情更难使用并损害性能。

    基本上,除非您有充分的理由不这样做,否则请坚持使用单例。

    【讨论】:

      【解决方案3】:

      您主要需要单身人士。 (Spring 默认。)单例必须是线程安全的,因为并行请求将使用相同的单个实例。事实上,它们必须是完全无状态的,因为它可以随时被销毁和重新创建。

      如果您需要跟踪 bean 内部的状态(您不应该,这应该在数据库中或存储在请求中),您将获得许多相同类型 bean 的实例,内存使用量会随着请求的数量,因此对于单例,您仍然只有一个实例。

      即使您将 bean 限定为请求,它们仍必须至少是线程安全的(请求同时来自同一浏览器)。

      【讨论】:

      • Spring 单例 bean 可以随时被创建和销毁,我不知道你从哪里得到的(也许你把它们与 EJB 会话 bean 混淆了) .此外,Spring 单例中的可变状态绝对没问题,您只需要知道可以对该共享状态执行哪些操作。
      • Thready safety 是关于实现,而不是 bean 范围。单例类可能不是线程安全的,而原型类可能是线程安全的。
      【解决方案4】:

      服务层应该是单例的,否则对于每个传入的请求都会创建一个新对象,这些对象很重,包含业务逻辑和大量代码行。他们必须是单身人士。

      【讨论】:

        猜你喜欢
        • 2011-02-11
        • 2020-05-04
        • 2012-01-04
        • 1970-01-01
        • 2013-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多