spring的bean单例和单例设计模式
Spring单例Bean与单例模式的区别在于他们关联的环境不⼀样,单例模式是指在⼀个jvm进程中仅有⼀个实例,⽽Spring单例是指⼀个Spring Bean容器(ApplicationContext)中仅有⼀个实例。
单例设计模式,在⼀个JVM进程中(理论上,⼀个运⾏的Java程序,就必定有⾃⼰独⽴的JVM)仅有⼀个实例,于是⽆论在程序的何处获取实例,始终都返回同⼀个对象,以Java内置的Runtime为例(现在枚举是单例模式的最佳实践),⽆论何时获取,下⾯的判断始终为真:
// 基于懒汉模式实现
// 在⼀个JVM实例中始终只有⼀个实例
spring framework表达式Runtime() == Runtime()
与此相⽐,Spring的单例Bean是与其容器(ApplicationContext)密切相关的,所以在⼀个JVM进程中,如果有多个Spring容器,即使是单例bean,也⼀定会创建多个实例,代码⽰例如下:
// 第⼀个Spring Bean容器
ApplicationContext context_1 = new FileSystemXmlApplicationContext("classpath:/l");
Person peo1= Bean("yiifaa", Person.class);
// 第⼆个Spring Bean容器
ApplicationContext context_2 = new FileSystemXmlApplicationContext("classpath:/l");
Person peo2= Bean("yiifaa", Person.class);
// 这⾥绝对不会相等,因为创建了多个实例
System.out.println(peo1== peo2);
Spring的配置⽂件:
<!-- 即使声明了为单例,只要有多个容器,也⼀定会创建多个实例 -->
<bean id="yiifaa" class="com.stixu.anno.Person" scope="singleton">
<constructor-arg name="username">
<value>yiifaa</value>
</constructor-arg>
</bean>
总结
Spring的单例bean与Spring bean管理容器密切相关,每个容器都会创建⾃⼰独有的实例,所以与GOF设计模式中的单例模式相差极⼤,但在实际应⽤中,如果将对象的⽣命周期完全交给Spring管理(不在其他地⽅通过new、反射等⽅式创建),其实也能达到单例模式的效果
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论