Spring单例Bean与单例模式的区别
Spring单例Bean与单例模式的区别在于它们关联的环境不一样,单例模式是指在一个JVM进程中仅有一个实例,而Spring单例是指一个Spring Bean容器(ApplicationContext)中仅有一个实例。
首先看单例模式,在一个JVM进程中(理论上,一个运行的JAVA程序就必定有自己一个独立的JVM)仅有一个实例,于是无论在程序中的何处获取实例,始终都返回同一个对象,以Java内置的Runtime为例(现在枚举是单例模式的最佳实践),无论何时何处获取,下面的判断始终为真:
// 基于懒汉模式实现
// 在一个JVM实例中始终只有一个实例
Runtime.getRuntime() == Runtime.getRuntime()
与此相比,Spring的单例Bean是与其容器(ApplicationContext)密切相关的,所以在一个JVM进程中,如果有多个Spring容器,即使是单例bean,也一定会创建多个实例,代码示例如下:
// 第一个Spring Bean容器
ApplicationContext context_1 = new FileSystemXmlApplicationContext("classpath:/ApplicationContext.xml");
Person yiifaa_1 = context_1.getBean("yiifaa", Person.class);
// 第二个Spring Bean容器
ApplicationContext context_2 = new FileSystemXmlApplicationContext("classpath:/ApplicationContext.xml");
Person yiifaa_2 = context_2.getBean("yiifaa", Person.class);
// 这里绝对不会相等,因为创建了多个实例
System.out.println(yiifaa_1 == yiifaa_2);
以下是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、反射等方式创建),其实也能达到单例模式的效果。
Spring单例Bean与单例模式的区别相关推荐
- Spring框架中的单例Bean是线程安全的么?
答: 不是安全的. Spring中的Bean默认是单例模式的,框架并没有对bean进行多线程的封装处理. 注:单例bean是指IOC容器中就只有这么一个bean,是全局共享的,有多少个线程来访问用的都 ...
- 头条一面:Spring IOC容器中只存放单例Bean吗?
最近,很多小伙伴出去面试,感觉自己面的不是很理想,回来后,不少小伙伴把面试题做了记录发给我,让我给大家解析下,然后发出来.当我看到这些面试题时,快速在脑海中构建起了整个知识体系,从基础到框架.从分布式 ...
- Spring IOC 容器源码分析 - 创建单例 bean 的过程
1. 简介 在上一篇文章中,我比较详细的分析了获取 bean 的方法,也就是getBean(String)的实现逻辑.对于已实例化好的单例 bean,getBean(String) 方法并不会再一次去 ...
- Spring IOC 容器源码分析 - 获取单例 bean
1. 简介 为了写 Spring IOC 容器源码分析系列的文章,我特地写了一篇 Spring IOC 容器的导读文章.在导读一文中,我介绍了 Spring 的一些特性以及阅读 Spring 源码的一 ...
- 单元测试 applicationinfomanager bean无法注入_你真的会用Spring吗?如何在单例Bean中注入原型Bean...
遇到什么问题 假设单例 BeanA 需要使用原型 BeanB(BeanB 可能是 BeanA 的一个属性值).可是容器仅创建一次单例 BeanA,因此只有一次机会来设置属性 BeanB. @Scope ...
- spring 单例 获取多例的位_Spring系列第6篇:玩转bean scope,避免跳坑里!
公众号关注"程序员二哥", 设为'星标',带你学习更多的知识. 本文内容 详细介绍5中bean的sope及使用注意点 自定义作用域的实现 应用中,有时候我们需要一个对象在整个应用中 ...
- Spring源码 - 从缓存中获取单例Bean
# Spring源码 - 从缓存中获取单例Bean Spring版本:Spring 5.3.13-release # 1.从缓存中获取单例Bean 单实例Bean在Spring的同一个容器中只会创建一 ...
- 在spring中,prototype scoped bean 如何注入单例bean中
2019独角兽企业重金招聘Python工程师标准>>> 参考博文:http://www.javacodegeeks.com/2012/08/spring-scoped-proxy.h ...
- Spring框架中的单例Bean是线程安全的吗?
首先直接给出答案:不是线程安全的 一.分析问题 证明不是线程安全的案例如下: public class Student {private String stuName;public String re ...
最新文章
- SLAM学习--------相机位姿表示-李群李代数
- 【移动通信】天线原理
- redis的集群搭建
- 07/11/20 资料整理
- 分布式和集群区别以及分布式事务
- oracle临时表空间地址,Oracle认证:详解OracleTemp临时表空间处理方法
- Unity3D-InstantOC遮挡剔除
- Linux系统:常用Linux系统管理命令总结
- matlab 画图直接存储_Matlab Figure图形保存
- 【鲲鹏 DevKit黑科技解读】│如何实现全链路系统问题90%精准诊断?
- bzoj 1565 [NOI2009]植物大战僵尸【tarjan+最大权闭合子图】
- Vue登录注册,并保持登录状态
- 9位工作流业内专家联袂推荐
- 循环神经网络应用举例
- iOS 10 消息推送(UserNotifications)秘籍总结(一)
- Date对象身上的绑定的属性与方法
- 直流电机/步进电机/舵机区别
- linux之安装nali本地解析IP归属
- linux 播放mkv视频,Fedora 22 怎么播放 rmvb mp4 mkv 视频文件
- 魔兽世界服务端源码各个重要文件详细情况说明开服一条龙