【问题标题】:Are Java Spring services evil as they are singleton? [closed]Java Spring 服务是单例的吗? [关闭]
【发布时间】:2014-12-30 10:45:11
【问题描述】:

我已经阅读了许多关于 web 和 stack 的讨论,它们声称单例是邪恶的。 喜欢: root-cause-of-singletonsWhy is Singleton considered an anti-pattern?

我读过诸如“单例使代码复杂,重用和测试痛苦”之类的 cmets。 我使用具有无状态单例的 Spring Services 的代码,但我看不出这些点是如何存在的。

此类服务是否也属于不良做法?为什么?还是所有的争论都只针对有状态的单例?

【问题讨论】:

  • 邪恶只存在于有状态的单例中
  • @ControlAltDel 我不明白为什么这个问题“主要基于意见”。正如 Marko 所回答的,很明显,我指出的辩论是关于单例模式的,与 Spring 的单例无关。

标签: java spring design-patterns singleton


【解决方案1】:

您将 Spring 的单例(一个普遍的好东西)与 单例设计模式混淆了,后者受到您参考资料中提到的问题的影响。

单例模式假定存在引用单例对象的static 全局变量。它通常还假设有很多样板代码用于管理单例的生命周期(例如,懒惰地初始化它)。

Spring 既不让你实现单例模式,也不在内部使用它。 Spring 单例以声明方式创建并连接在一起形成完整的对象图,包括循环依赖的解析。

【讨论】:

    【解决方案2】:

    (评论作为可读性的答案。)

    单身人士本质上并不邪恶,它们只是容易被误用。

    如果不管理对象的单一性,那么问题就更小了。

    我不同意其他人关于状态单例的观点;虽然它可能会做错,但有许多带有状态的单例模式可以正常工作,例如池。

    【讨论】:

      【解决方案3】:

      如果 Spring Singleton 是有状态的,它就是邪恶的。无状态的单例很好:

      • 没有字段,
      • 无状态字段(例如数据源),在启动时初始化。

      【讨论】:

        猜你喜欢
        • 2014-02-25
        • 1970-01-01
        • 1970-01-01
        • 2015-04-25
        • 2013-06-13
        • 2011-01-11
        • 2020-01-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多