spring单例bean与设计模式的单例模式的区别在于它们关联的环境不一样。
单例模式是指在一个JVM进程中仅有一个实例,无论在程序中何处获取该实例,始终都返回同一个对象。
而spring单例是指一个spring bean容器(ApplicationContext)中仅有一个实例。
spring的单例bean是与其容器密切相关的,如果在一个JVM进程中有多个spring容器,即使是单例bean,也一定会创建多个实例,
// 第一个Spring Bean容器
ApplicationContext context_1 = new FileSystemXmlApplicationContext("classpath:/ApplicationContext.xml");
UserBean1 userBean_1 = context_1.getBean("userBean1", UserBean1.class);
// 第二个Spring Bean容器
ApplicationContext context_2 = new FileSystemXmlApplicationContext("classpath:/ApplicationContext.xml");
UserBean1 userBean_2 = context_2.getBean("userBean1", UserBean1.class);
// 这里绝对不会相等,因为创建了多个实例
System.out.println(userBean_1 == userBean_2);
applicationContext.xml配置文件
<!-- 即使声明了为单例,只要有多个容器,也一定会创建多个实例 -->
<bean id="userBean1" class="demo2.UserBean1" scope="singleton"></bean>
signleton:只有一个共享的实例存在,所有对这个bean的请求都会返回这个唯一实例。
prototype:对这个bean的每次请求都会创建一个新的bean实例,类似于new
spring bean默认是单例模式。
在实际应用中,如果将对象的生命周期完全交给spring管理,不在其他地方通过new,反射等方式创建,其实也能达到单例模式的效果。
单例模式:
1,只有一个共享的实例存在,所有对这个bean的请求都会返回这个唯一的实例。
2,不同的请求可以同时拿这个实例来用,执行实例中不同的方法时,可以同时进行,但是不可以同时执行该实例的同一个方法。其实就是单例模式的线程安全问题。
3,实例里面不可以有成员变量,因为成员变量共享的话,一个对它修改,另一个再拿来用,用的是修改之后的,会不安全。