在使用Spring开发时,Spring提供了五种scope,分别为singleton,prototype,request,session,global session。



上图为各个scope描述的官方文档截图。Spring在一开始的时候只提供了singleton和prototype两种bean scope.

单例bean与原型bean的区别,以及Spring中的bean为何默认是单例模式

单例Bean和原型Bean的区别(Singleton VS Prototype)

当一个bean被声明为单例bean(singleton)的时候,在处理多次请求的时候Spring容器中只会实例化出一个bean,且后续的请求都会共用这个对象,这个对象将被保存在一个Map集合中。当有请求来时则先从缓存中查看之前有无生成该对象,有的话直接使用这个对象,没有则实例化一个新的对象。而对于原型bean(Prototype)来说,每次请求来时都直接实例化新的bean,没有从缓存中查询获取的过程。

单例bean的优势

  • 减少了新生成实例的消耗。这个消耗主要体现在①Spring在创建实例时会造成性能的消耗。②给对象分配内存也会涉及到一些复杂的算法。
  • 可以快速的获取到bean。在单例下的bean除了第一次生成时需要创建bean外,其余时间都是从缓存(Map)中获取,所以速度快。
  • 减少jvm垃圾回收。对于所有请求只生成一个bean实例,所以垃圾回收自然就少了。

单例bean的劣势

单例bean的一个很大劣势是他是线程不安全的。由于所有请求都共享一个bean实例,且当这个bean有状态的时候在并发的场景下容易出现问题,相比之下原型bean则不会有这样的问题(也有例外,比如这个原型bean被单例bean所依赖),因为原型bean会给每个请求都新创建实例。

总结

Spring中bean之所以默认是单例模式,主要还是为了提高性能,从前面的少创建实例,缓存快速获取以及减少垃圾回收可看出。而单例模式的劣势在于如果bean有状态则在并发环境下是线程不安全的。

单例bean与原型bean的区别的更多相关文章

  1. JS单例对象与构造函数对象的区别

    JavaScript对象有几种: 内置对象如Global,Math对象等等. 本地对象如Object.Function.Array.String.Boolean.Number.Date.RegExp. ...

  2. Spring5源码解析-Spring框架中的单例和原型bean

    Spring5源码解析-Spring框架中的单例和原型bean 最近一直有问我单例和原型bean的一些原理性问题,这里就开一篇来说说的 通过Spring中的依赖注入极大方便了我们的开发.在xml通过& ...

  3. Spring单例Bean和线程安全

    Spring的bean默认都是单例的,这些单例Bean在多线程程序下如何保证线程安全呢?例如对于Web应用来说,Web容器对于每个用户请求都创建一个单独的Sevlet线程来处理请求,引入Spring框 ...

  4. Spring 为啥默认把bean设计成单例的?

    熟悉Spring开发的朋友都知道Spring提供了5种scope分别是singleton.prototype.request.session.global session. 如下图是官方文档上的截图, ...

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

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

  6. spring创建单例bean

    (使用的spring版本是3.2.10) 在xml文件中配置一个普通的bean,默认使用单例,创建该bean的调用栈如下: ClassPathXmlApplicationContext //Class ...

  7. 单例Bean注册表接口SingletonBeanRegistry

    Github: SingletonBeanRegistry.java SingletonBeanRegistry package org.springframework.beans.factory.c ...

  8. 容器工厂(原型&单例)

    上一篇讲的是容器工厂的原型. 我们可以不必通过new关键之创建实例,可以直接取容器里面的实例. 我们可以发现,在对比他们的地址值的时候,他们是相同的为true. 如果我们需要的是不一样的呢.也就是有一 ...

  9. SSH中Action的单例与多例

    Structs2中的Bean默认的是单例,在整个程序运行期间,每个Bean只有一个实例,只要程序在运行,这个实例就一直存在. 对于Action来说,单例就容易出问题.如果客户端每次提交的参数都是一样的 ...

  10. Spring的单例实现原理-登记式单例

    单例模式有饿汉模式.懒汉模式.静态内部类.枚举等方式实现,但由于以上模式的构造方法是私有的,不可继承,Spring为实现单例类可继承,使用的是单例注册表的方式(登记式单例). 什么是单例注册表呢, 登 ...

随机推荐

  1. ElasticSearch之Task management API

    命令样例如下: curl -X GET "https://localhost:9200/_tasks?pretty" --cacert $ES_HOME/config/certs/ ...

  2. STM32CubeMX教程3 GPIO输入 - 按键响应

    1.准备材料 开发板(STM32F407G-DISC1) ST-LINK/V2驱动 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) 2 ...

  3. Ubuntu系统 安装 Zabbix Server 6.0

    Zabbix6.0简介: zabbix6.0新特性 1.开箱即用的Zabbix server高可用群集 Zabbix server高可用防止硬件故障或计划维护期的停机: 原生选择加入HA群集配置 定义 ...

  4. JavaFx之从controller关闭stage(十八)

    JavaFx之从controller关闭stage(十八) 开发时,我们需要从controller的button时间中关闭当前,那么你的按钮事件可以这样: @FXML public Button ca ...

  5. Spring源码学习笔记7——Spring bean的初始化

    一丶前言 上篇中我们了解了Spring bean的实例化--存在方法覆盖的使用CGLIB动态代理生成子类,反之反射调用构造函数.实例化后bean中的字段都是默认值,接下来就是对bean的属性进行填充, ...

  6. 11、层叠布局(Stack、Align、 Positioned)

    Flutter Stack组件 Stack表示堆的意思,我们可以用Stack或者Stack结合Align或者Stack结合 Positiond来实现页面的定位 布局  Alignment(对齐)类是用 ...

  7. 实例解析丨一文搞定GaussDB CM服务异常

    摘要:本文主要为大家带来如何处理GaussDB CM服务异常问题. 本文分享自华为云社区<[实例状态]GaussDB CM服务异常>,作者:酷哥. 首先确认是否是虚拟机.网络故障,底层故障 ...

  8. tsconfig.json在配置文件中找不到任何输入,怎么办?

    摘要:原来在我们创建tsconfig.json文件的时候,VSCode会自动检测当前项目当中是否有TS文件:如果没有的话,就会报这个错提示我们去创建一个文件,再去使用. 本文分享自华为云社区<t ...

  9. 云图说|云数据库RDS跨区域备份

    摘要:云数据库RDS支持将备份文件存放到另一个区域存储,某一区域的实例故障后,可以在异地区域使用备份文件在异地恢复到新的RDS实例,用来恢复业务. 本文分享自华为云社区<云图说_云数据库RDS- ...

  10. Shell:Lite OS在线调试工具知多少

    摘要:Shell作为Huawei Liteos在线调试工具,可以通过串口工具输入输出,支持常用的基本调试功能.同时用户可以新增定制的命令,新增命令需重新编译烧录后才能执行 本文分享自华为云社区< ...