我是否过度使用了Spring单例?

4
我看到了很多关于单例设计模式的负面评论,但从我所了解的来看,Spring singleton并不是同一件事情,使用它是完全可以的。
然而,最近我开始怀疑我是否在新应用程序中过度使用了它。我的应用程序中几乎所有的类都是Spring singleton beans。这是一个Jersey web服务,其中有一些服务类会注入业务对象类(IoC),这些类包含所有的业务逻辑并与DAO类进行通信,DAO类也是由Spring注入的。
我认为,因为我可以轻松地使所有的类无状态,所以不存在线程安全问题,而且因为Spring缓存了类的实例,所以从性能上来说,这是一个合理的解决方案。
我后来看到了由第三方供应商开发的我们公司的一个应用程序,他们把所有的Spring beans定义为“singleton=false”,即使大部分bean没有状态。我开始想,这是否是Spring beans的最佳实践方法,如果我实际上过度使用了单例?
有没有人对最佳实践方面有任何评论?我应该尽可能使用Spring singleton还是应该避免使用?

1
我认为“过度使用”这种事情是不存在的。只要确保你适当地使用它们(即正确地范围化你的beans),就可以了。更多信息请参见Bean scopes - mre
1
我觉得你的做法没问题。但是第三方供应商让我有些犹豫。如果他们从来没有创建过多个bean实例,那么将其标记为singleton=false会给配置文件读者带来误导。 - sparc_spread
1个回答

5
你的方法很好。单例模式通常存在一个问题(除了全局可变状态,听起来这里不是问题),即单例模式管理其自身的唯一性(例如静态getInstance方法),使得测试变得困难。在Spring中,通过工厂控制单例的作用域来处理这个问题。
单例模式的另一个麻烦之处在于任何东西都可以从任何地方被调用。你可以通过遵循分层的纪律性方法来解决这个问题。

单例模式通常存在的问题是被过度使用,导致应用程序数据变得分散和不连贯。 - Hot Licks
@热门话题:同意,如果我的编辑没有涵盖到,我愿意听取建议。 - Nathan Hughes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接