普通老单身或春天单身豆?

时间:2010-10-13 04:04:49

标签: spring oop singleton

我的应用程序中有一个单独的服务。 我的应用程序因使用spring框架而变得臃肿。

我很困惑使用单件服务作为

1:Plain Old Singleton [需要时静态访问]

或作为

2:Spring单例bean。 [需要时使用DI进行注射]

哪种方法是正确的?

2 个答案:

答案 0 :(得分:2)

Spring单例范围与Singleton设计模式不同,后者与具有静态方法的类不同。

来自文档

“请注意,Spring的单例bean概念与开创性的Gang of Four(GoF)模式书中定义的Singleton模式完全不同.GoF Singleton硬编码对象的范围,只有一个每个ClassLoader都会创建一个特定类的实例.Spring单例的范围最好按容器和每个bean来描述。这意味着如果在一个Spring容器中为特定类定义一个bean,那么Spring容器将创建由该bean定义定义的类的唯一一个实例。“

另外,请注意,使用Spring单例作为Web请求将使用的服务时需要非常小心。由于每个请求都在自己的线程上,如果您的单例维护任何状态,则可能会出现线程问题。

回答你的问题:创建一个实现接口的类,并使用Spring对DI进行适当的处​​理。如果您的服务不维护状态,您可以将其范围限定为单例,否则您可以将其范围限定为原型。

答案 1 :(得分:0)

尽可能使用Spring的bean。该框架旨在管理这些事情,它可能比我更好。使用Spring的依赖注入的另一个原因是可以使用模拟而不是真实的实用程序代码进行单元测试,从而将单元测试集中到精确的范围。

编辑: 为了回答评论中的问题,我能想到的非豆单例的唯一情况是实用程序代码类,它将在公共静态方法中包含通常可重用代码的短片段。其他任何东西都需要实例化,因此 - 一个bean。