Spring:Singleton VS Prototype

时间:2016-12-21 13:42:59

标签: java spring scopes

我是Spring的新手,开始学习新的概念,我找到了关于bean Scopes的话题:   - Singleton :每次都返回相同的实例。   - Prototype :每个请求返回对象的新实例。

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

4 个答案:

答案 0 :(得分:2)

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

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

例如,如果 Triangle 类中有 Point 对象作为成员变量,则在Singleton的情况下,当实例化Triangle类时,Point对象也被实例化,因为它是依赖的。

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

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

希望这有帮助。

答案 1 :(得分:1)

如果在modal处注入相同的实例,则可以使用它的共享状态来包含任何类型的数据。如果在任何时候注入bean时都创建了新实例 - 它的状态不会被共享。默认情况下,所有bean都是SingletonSingletons范围代表bean的内部数据对于您注入bean的每个位置应该是唯一的情况。

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

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

对于 Prototype ,我刚刚使用Prototype找到了这种情况:

  

让我们用一个例子来理解这个模式。我正在创建一个需要电影实例的娱乐应用程序,   专辑和Show课程非常频繁。我不想每次都创建他们的实例,因为它很昂贵。   所以,我将创建他们的原型实例,每当我需要一个新实例时,   我将克隆原型。

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