2

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

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

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

4

3 回答 3

6

public static-flavored singletons 不受欢迎是因为它们被硬连线到一个类中,而不是因为它们是全局的。例如,人们会告诉你他们不可能模拟测试。如果您只有少数全局对象,则不需要 Spring 来避免这种普通的 Java 单例。但是,如果您有一个需要连接在一起的大量对象图,那么如果您使用 DI 方法,您的代码将会变得更加简洁。

Spring 中有很多便利来管理 bean 生命周期,尤其是您可以相当轻松地更改生命周期,例如从单例到原型。由于延迟决定并发执行部分代码,并且代码依赖于非线程安全对象,可能会出现这种要求。

于 2013-10-12T21:40:07.917 回答
1

请注意,会话范围的 bean 仅在WebApplicationContext.

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

于 2013-10-12T21:17:31.480 回答
0

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

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

于 2019-10-10T15:07:55.503 回答