为什么Spring单例范围的bean比经典的Singleton模式更好?

时间:2013-10-12 21:08:39

标签: java spring design-patterns dependency-injection singleton

我确实理解Spring单例范围的bean(它们对每个Spring上下文都有一个实例)和Singleton模式(它们有一个用于类加载器的实例)之间的区别。

我注意到,对于许多人来说,Singleton模式被认为是邪恶的(因为它们就像全局引用一样),而似乎没有人反对单例范围的bean(它们也是全局可用的)。这是为什么?

我有一个(桌面)应用程序,我需要对某些对象进行全局访问,因为将引用传递给几十个类和方法会非常麻烦。但是我不想使用DI框架,因为应用程序的启动时间很重要。什么是最好的设计?

3 个答案:

答案 0 :(得分:6)

public static - 风味单身人士不喜欢因为他们被硬连接到一个班级,而不是因为他们是全球性的。例如,人们会告诉你他们不可能模仿测试。如果你只有少数全局对象,那么你不需要Spring来避免这种普通的Java单例。但是,如果您有一个需要连接在一起的实质对象图,那么如果您使用DI方法,您的代码将变得更加清晰。

Spring中有很多方便来管理bean生命周期,你可以非常方便地更改生命周期,例如从单例到原型。由于后期决定同时执行部分代码,并且代码依赖于非线程安全对象,可能会出现这样的要求。

答案 1 :(得分:1)

请注意session-scoped beans are only relevant in a WebApplicationContext.

Spring(或任何其他IoC容器)负责创建这些bean,您的所有应用程序都必须担心它们正在请求它们。这就是为什么使用DI管理单例更好/更容易的原因。

答案 2 :(得分:0)

使用公共静态样式单例: 1.单元测试很困难。考虑使用构造函数注入模拟依赖项,这是不可能的! 2.难以在对象销毁之前或之前执行清理操作。对象可以生存到应用程序结束。

使用Sprint Singleton样式模式: 1.可以使用new关键字创建Bean,构造函数注入可以轻松完成。 2.由于构造函数注入,可以使用模拟对象进行单元测试。 3.可以完全控制Singleton bean的生命周期,例如Post-Construct(在创建对象之后执行某些操作)和Pre-Destroy(在对象销毁之前执行某些操作) 4.可以很容易地将Singleton Bean更改为非Singleton Bean,例如Prototype。