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与单例模式的区别相关推荐

  1. Spring框架中的单例Bean是线程安全的么?

    答: 不是安全的. Spring中的Bean默认是单例模式的,框架并没有对bean进行多线程的封装处理. 注:单例bean是指IOC容器中就只有这么一个bean,是全局共享的,有多少个线程来访问用的都 ...

  2. 头条一面:Spring IOC容器中只存放单例Bean吗?

    最近,很多小伙伴出去面试,感觉自己面的不是很理想,回来后,不少小伙伴把面试题做了记录发给我,让我给大家解析下,然后发出来.当我看到这些面试题时,快速在脑海中构建起了整个知识体系,从基础到框架.从分布式 ...

  3. Spring IOC 容器源码分析 - 创建单例 bean 的过程

    1. 简介 在上一篇文章中,我比较详细的分析了获取 bean 的方法,也就是getBean(String)的实现逻辑.对于已实例化好的单例 bean,getBean(String) 方法并不会再一次去 ...

  4. Spring IOC 容器源码分析 - 获取单例 bean

    1. 简介 为了写 Spring IOC 容器源码分析系列的文章,我特地写了一篇 Spring IOC 容器的导读文章.在导读一文中,我介绍了 Spring 的一些特性以及阅读 Spring 源码的一 ...

  5. 单元测试 applicationinfomanager bean无法注入_你真的会用Spring吗?如何在单例Bean中注入原型Bean...

    遇到什么问题 假设单例 BeanA 需要使用原型 BeanB(BeanB 可能是 BeanA 的一个属性值).可是容器仅创建一次单例 BeanA,因此只有一次机会来设置属性 BeanB. @Scope ...

  6. spring 单例 获取多例的位_Spring系列第6篇:玩转bean scope,避免跳坑里!

    公众号关注"程序员二哥", 设为'星标',带你学习更多的知识. 本文内容 详细介绍5中bean的sope及使用注意点 自定义作用域的实现 应用中,有时候我们需要一个对象在整个应用中 ...

  7. Spring源码 - 从缓存中获取单例Bean

    # Spring源码 - 从缓存中获取单例Bean Spring版本:Spring 5.3.13-release # 1.从缓存中获取单例Bean 单实例Bean在Spring的同一个容器中只会创建一 ...

  8. 在spring中,prototype scoped bean 如何注入单例bean中

    2019独角兽企业重金招聘Python工程师标准>>> 参考博文:http://www.javacodegeeks.com/2012/08/spring-scoped-proxy.h ...

  9. Spring框架中的单例Bean是线程安全的吗?

    首先直接给出答案:不是线程安全的 一.分析问题 证明不是线程安全的案例如下: public class Student {private String stuName;public String re ...

最新文章

  1. SLAM学习--------相机位姿表示-李群李代数
  2. 【移动通信】天线原理
  3. redis的集群搭建
  4. 07/11/20 资料整理
  5. 分布式和集群区别以及分布式事务
  6. oracle临时表空间地址,Oracle认证:详解OracleTemp临时表空间处理方法
  7. Unity3D-InstantOC遮挡剔除
  8. Linux系统:常用Linux系统管理命令总结
  9. matlab 画图直接存储_Matlab Figure图形保存
  10. 【鲲鹏 DevKit黑科技解读】│如何实现全链路系统问题90%精准诊断?
  11. bzoj 1565 [NOI2009]植物大战僵尸【tarjan+最大权闭合子图】
  12. Vue登录注册,并保持登录状态
  13. 9位工作流业内专家联袂推荐
  14. 循环神经网络应用举例
  15. iOS 10 消息推送(UserNotifications)秘籍总结(一)
  16. Date对象身上的绑定的属性与方法
  17. 直流电机/步进电机/舵机区别
  18. linux之安装nali本地解析IP归属
  19. linux 播放mkv视频,Fedora 22 怎么播放 rmvb mp4 mkv 视频文件
  20. 魔兽世界服务端源码各个重要文件详细情况说明开服一条龙

热门文章

  1. Edge导航网址变成了毒霸的,如何改动?
  2. 专题·关基保护 | 国家关键信息基础设施安全保护的法治进展
  3. 自动发qq空间说说python脚本
  4. Nginx配置WS、WSS域名
  5. 变换矩阵在二维图形中的应用
  6. 【leetcode】搜索二维矩阵 II
  7. 两万字长文总结,梳理 Java 入门进阶那些事(推荐收藏)
  8. idea Translation翻译插件失效解决办法
  9. 编译原理学习笔记(十九)~习题:将语句翻译为三地址代码
  10. linux汇编.section与.globl