Java Spring:单例VS原型

Java Spring:单例VS原型,java,spring,scopes,Java,Spring,Scopes,我刚接触Spring,开始学习新的概念,我发现这个话题是关于bean范围的: -Singleton:每次返回相同的实例。 -Prototype:根据每个请求返回对象的新实例 我的问题是:这对我有什么帮助相同的实例和对象的新实例之间有什么区别,或者为什么原型范围存在 它有助于设计软件,参考您填写的java设计模式,找到许多有用的信息,如果是单例,您将只能创建对象,这将有助于1.节省创建非常复杂对象的时间(我们可以重用同一对象)2.有时我们需要在整个应用程序中使用相同的对象,例如,如果您想计算应用程

我刚接触Spring,开始学习新的概念,我发现这个话题是关于bean范围的: -Singleton:每次返回相同的实例。 -Prototype:根据每个请求返回对象的新实例


我的问题是:这对我有什么帮助相同的实例和对象的新实例之间有什么区别,或者为什么原型范围存在

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

如果相同的实例作为
单例到处注入,您可以使用它的共享状态来包含任何类型的数据。若在注入bean的任何时候都创建了新实例,那个么它的状态是不共享的。默认情况下,所有bean都是
singleton
Prototype
scope表示bean的内部数据对于您注入bean的每个地方都应该是唯一的情况

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


另请参见:

我对单例的理解更可能用于返回单个实用程序实例

//SomeUtil is Singleton
var util = SomeUtil.getInstance();
print(util.doTask1());
print(util.doTask2());
如果另一个线程进入这些代码,SomeUtil.getInstance()只返回SomeUtil实例,而不是创建一个新实例(创建一个新实例可能会花费很多)

至于Prototype,我只是使用Prototype发现了这种情况:

让我们通过一个例子来理解这个模式。我正在创建一个需要电影实例的娱乐应用程序, 经常上相册和表演课。我不想每次都创建它们的实例,因为这代价很高。 因此,我将创建它们的原型实例,每当我需要一个新实例时, 我将克隆原型


示例代码定位

同一实例意味着从
ApplicationContext
BeanFactory
getBean()
的任何调用(从任何地方)都将使您使用同一实例,即在初始化Spring时只调用一次构造函数(每个Spring容器)

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

例如,如果有一个对象作为三角形类中的成员变量,在单例情况下,当三角形类被实例化时,点对象也会被实例化,因为它是依赖的

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

谷歌搜索肯定会帮助你找到答案和示例来演示用例


希望这能有所帮助。

你能用简单的例子解释一下吗,因为我不懂休息。@MohamedNagy想象不同的家庭需要猫——因为他们是孤独的。他们要求spring框架将猫注入他们的家庭,但每只猫都有自己的名字,每个家庭都会定义自己。如果猫有
原型
范围-每个家庭都可以选择唯一地称呼它的猫。如果他们有
独生子女
范围-每个家庭都将更改所有邻居的姓名。回答此问题: