Spring : 单例 VS 原型

Spring : Singleton VS Prototype

我是 Spring 的新手,开始学习新概念,我找到了关于 bean 作用域的主题: - Singleton : returns 每次都是同一个实例。 - 原型:returns每个请求的对象新实例。

我的问题是:这对我有什么帮助?同一个实例和对象的新实例之间有什么区别,或者为什么存在原型作用域!

它有助于设计软件,参考 java 您填写的设计模式可以找到很多有用的信息,如果是单例,您将只能创建对象,这将有助于像 1.saving 这样的情况创建一个非常复杂的对象的时间(我们可以重用同一个对象)2.Some 次我们需要在整个应用程序中使用同一个对象例如,如果你想计算应用程序中活跃用户的总数,你可以使用单例对象来存储它,因为只有一个对象,因此您可以轻松地更新和检索数据。在 Prototype 的情况下,它总是会给你不同的对象,在某些情况下是必要的,比如一些访问令牌,你应该总是获得新的 /valid 令牌才能继续,所以原型模式 /Bean 很有用。

如果同一个实例像 Singleton 一样被注入所有地方,您可以使用它的共享状态来包含任何类型的数据。如果在任何时候注入 bean 时创建新实例 - 它的状态不共享。默认情况下,所有 bean 都是 SingletonsPrototype scope 代表 bean 的内部数据对于每个注入 bean 的地方应该是唯一的。

示例: 您拥有代表 REST 客户端的 bean。应用程序的不同部分使用不同的 REST 服务,每个部分都需要一些特定的请求 headers - 例如,出于安全目的。您可以在所有这些 bean 中注入相同的 REST 客户端,使其拥有自己的具有某些特定 headers 的 REST 客户端 bean。同时,您可以为整个应用程序配置共同的客户端策略 - 请求超时等。

另请参阅: When to use Spring prototype scope?

我对Singleton的理解更可能用于return单个Utility实例等情况。

//SomeUtil is Singleton
var util = SomeUtil.getInstance();
print(util.doTask1());
print(util.doTask2());

如果另一个线程进入这些代码,SomeUtil.getInstance() 只是 return SomeUtil 实例而不是创建一个新实例(创建一个新实例可能会花费很多)。

关于Prototype,我刚刚使用Prototype发现了这种情况:

Lets understand this pattern using an example. I am creating an entertainment application that will require instances of Movie, Album and Show classes very frequently. I do not want to create their instances everytime as it is costly. So, I will create their prototype instances, and everytime when i will need a new instance, I will just clone the prototype.

示例代码定位到https://github.com/keenkit/DesignPattern/tree/master/src/PrototypePattern

相同的实例意味着从 ApplicationContextBeanFactorygetBean() 的任何调用(从任何地方)都会让您进入相同的实例,即当 Spring 正在初始化(每个 Spring 容器)。

但是,在某些情况下您会希望使用不同的对象实例。

例如,如果你有一个Point对象作为Triangleclass中的成员变量,如果单例,当 Triangle class 被实例化时,Point 对象也被实例化,因为它是依赖的。

如果您需要不同的 Point 实例在其他地方使用,那么您需要将 Point 定义为原型,否则它具有相同的状态。

谷歌搜索肯定会帮助您找到答案和演示用例的示例。

希望这对您有所帮助。