单例设计模式与弹簧容器中的单例豆

2022-08-31 09:33:41

众所周知,我们在Spring容器中默认将Bean作为单例,如果我们有一个基于Spring框架的Web应用程序,那么在这种情况下,我们真的需要实现Singleton设计模式来保存全局数据,而不仅仅是在Spring中创建一个Bean。

如果我无法解释我真正想问什么,请耐心等待。


答案 1

Spring中的单例豆和单例模式有很大不同。单例模式表示,每个类装入器将创建一个且只有一个特定类的实例。

Spring 单例的范围被描述为“每个容器每个豆子”。它是Bean定义的范围,每个Spring IoC容器的单个对象实例。Spring 中的默认作用域是 Singleton。

即使默认作用域是单例,也可以通过指定元素的作用域属性来更改 Bean 的作用域。<bean ../>

<bean id=".." class=".." scope="prototype" />

答案 2

我发现“每个容器每个豆子”很难理解。我会说“容器中每个bean id一个bean”。让我们举个例子来理解它。我们有一个豆类示例。我在bean定义中定义了这个类中的两个bean,例如:

<bean id="id1" class="com.example.Sample" scope="singleton">
        <property name="name" value="James Bond 001"/>    
</bean>    
<bean id="id7" class="com.example.Sample" scope="singleton">
        <property name="name" value="James Bond 007"/>    
</bean>

因此,当我尝试获取id为“id1”的bean时,spring容器将创建一个bean,将其缓存并在使用id1引用的地方返回相同的bean。如果我尝试使用id7获取它,将从样本类创建另一个bean,每次使用id7引用它时,都会缓存并返回相同的bean。

对于单例模式,这不太可能。在 Singlton 模式中,每个类装入器始终创建一个对象。但是,在 Spring 中,将作用域设置为 Singleton 并不限制容器从该类创建多个实例。它只是再次限制为同一 ID 创建新对象,并在请求同一 ID 的对象时返回以前创建的对象参考


推荐