Spring框架中的Singleton和Prototype Bean作用域

news2024/9/30 19:34:21

Spring框架是依赖注入的事实上的框架,在开发可扩展、弹性和安全的云原生环境中具有良好的记录。

在使用Spring Beans时,初学者经常会对Spring beans和它们的作用域感到有些困惑。

以下是我对Singleton和Prototype Bean作用域的简单示例进行阐述的尝试。

Singleton Bean作用域:正如其名称所示,作用域为Singleton的beans在Spring应用程序上下文中只有一个实例可用,然而值得注意的是,同一bean在Spring常量中可以具有不同的Bean名称下拥有多个实例。

这个想法与_Singleton设计模式_的概念有些不同,后者表示一旦将Java类设计为单例,JVM将在内存中只有单个实例可用。

Illustration 1.0 下面的插图显示了一个账户服务Spring bean,该bean可以具有不同的名称,同一服务在Spring上下文中可以存在两个不同的名称。

5ce67ff733879582bd9ded16fafb0803.jpeg
 

当我们在Java应用程序中引用一个singleton类时,该类只有一个实例可用,然而在Spring中,Singleton并不意味着上下文中只有一个该类型的实例,它可以有多个具有不同名称的该类型实例。

Prototype Bean作用域:当应用程序程序员将bean的作用域定义为Prototype时,这意味着每次有人请求引用一个bean时,Spring框架会返回全新的bean实例。Spring框架管理对象类型。

Illustration 1.1: 下面的插图定义了一个Prototype作用域的bean,并解释了每次我们请求Spring时,Spring都会提供所请求的bean的新实例。

8a1c8ffc075972c1e6a0454c00ebbffa.jpeg
 

为什么要让一个bean具有Prototype作用域?

Prototype作用域是为了避免两个线程在访问Singleton Bean时出现竞争条件。由于多线程环境的交错性质,这是一个经典的并发问题,操作的结果是不可预测的。因此,为了确保每个线程都获得自己的bean副本,开发人员希望确保每个线程都获得自己的副本。

什么是竞争条件?

以股票应用程序为例。股票价格每秒钟更新一次,并且用于为特定股票ID更新股票价格的代码是在并发上下文中编写的,这意味着可能有多个调用者试图更新股票X的价格。考虑一个一系列步骤的情况:

1.Mike试图将股票X的价格更新为110美元。2.Mike读取股票X的价格并将其增加到120美元。3.与此同时,在Mike将此写入主内存之前,他去了洗手间。4.Bob拿着咖啡回来,看到屏幕上的旧股票价值为105,他将股票X的价值更新为125美元。5.Mike回来,然后将股票X的值再次更新为120美元。6.由于这个构造,Mike想要对股票X进行的更新对Bob是不可见的,他再次覆盖了它。7.这是典型的竞争条件,我希望每个人都理解,就像Mike和Bob可以在这里被线程A和线程B替换一样,在并发环境中。

如果StockPrice被定义为Prototype作用域的bean,则每个线程都会获得其自己的StockPrice副本,它们不会互相干扰。但是,获得Stock价格的不同副本并不消除对给定股票的Stock价格更新进行同步的需要,它需要在一系列原子步骤中完成,但为了避免复杂性,我们可以略过这个讨论,以便理解Prototype Bean作用域。

Illustration 1.2: 下面的插图定义了一个Prototype作用域的bean,并解释了每个线程都会获得Prototype bean的新实例。

9c2695937836cd20381cd5a7f9cd7e48.jpeg

总结:

1.默认情况下,Spring bean的作用域是Singleton。2.Singleton作用域的bean在Spring应用程序上下文中可以具有不同的名称下的多个实例。3.Prototype bean是Spring框架提供的一个约定,每次请求时都会由框架提供bean的新实例。4.Prototype作用域的bean可以用于Singleton作用域的bean,但应该注意我们如何从上下文中获取该bean,因为如果将Prototype bean定义在Singleton bean内部,则Spring提供的原型bean实例只会有一个,这违背了其自身的目的。5.为了避免竞争条件,可以使用Prototype Bean作用域。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/919890.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Midjourney API 的对接和使用

“ 阅读本文大概需要 4 分钟。 ” 在人工智能绘图领域,想必大家听说过 Midjourney 的大名吧。 Midjourney 以其出色的绘图能力在业界独树一帜。无需过多复杂的操作,只要简单输入绘图指令,这个神奇的工具就能在瞬间为我们呈现出对应的图像。无…

C#实现简单TCP服务器和客户端网络编程

在C#中进行网络编程涉及许多类和命名空间,用于创建和管理网络连接、传输数据等。下面是一些主要涉及的类和命名空间: System.Net 命名空间:这个命名空间提供了大部分网络编程所需的类,包括: IPAddress:用于…

2.IO控制器

第五章 I/O管理 2.I/O控制器 I/O控制器的组成: I/O控制器负责接收和识别从CPU发来的各种命令,同时需要翻译为具体的设备可以明白的命令,通过控制器与设备的接口发送给具体的设备,让设备执行相应的操作。 一个I/O控制器有可能会负…

跨越边界:从前端切图仔走进iOS开发(Swift版--上集)

本文简介 点赞 关注 收藏 学会了 本文将以前端开发者的视角,和各位工友进入iOS开发的世界。 本文以实战为导向,快速掌握iOS开发这个技能。 无论你是想要扩展技能领域,还是对iOS开发充满好奇,花一个下午学习本文都能打开iOS开…

AUTOSAR规范与ECU软件开发(实践篇)5.6 基于ISOLAR-A的系统级设计与配置方法(下)

目录 3 、系统配置 4、 ECU信息抽取 3 、系统配置 在完成了VehicleComposition建立后, 可以进行系统配置。 右键点击System→Create System Info→Elements|System(图5.83) 可以新建System Info, 命名为VehicleSystem, 结果如图5.84所示。 图5.83 System Info新建(一)

Unity 3D之 利用Vector3 计算移动方向,以及实现位移多少

文章目录 先分析代码,从代码中了解Vector3 moveDirection new Vector3(10f, 0f, 100f);合法吗Vector3 moveDirection new Vector3 (xf,yf,zf)不是用来表示三维坐标的怎么表示在某个方向的位移 先分析代码,从代码中了解 这段代码是一个在游戏开发中常见…

回归预测 | MATLAB实现DBN-ELM深度置信网络结合极限学习机多输入单输出回归预测

回归预测 | MATLAB实现DBN-ELM深度置信网络结合极限学习机多输入单输出回归预测 目录 回归预测 | MATLAB实现DBN-ELM深度置信网络结合极限学习机多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现DBN-ELM深度置信网络结合极限学习…

七夕学算法

目录 P1031 [NOIP2002 提高组] 均分纸牌 原题链接 : 题面 : 思路 : 代码 : P1036 [NOIP2002 普及组] 选数 原题链接 : 题面 : 思路 : 代码 : P1060 [NOIP2006 普及组] 开心的金明 原题链接 : 题面 : 思路 : 01背包例题 : 代码 : P1100 高低位交换 原题…

stm32之7.位带操作---volatile---优化等级+按键控制

源码--- #define PAin(n) (*(volatile uint32_t *)(0x42000000 (GPIOA_BASE0x10-0x40000000)*32 (n)*4)) #define PEin(n) (*(volatile uint32_t *)(0x42000000 (GPIOE_BASE0x10-0x40000000)*32 (n)*4)) #define PEout(n) (*(volatile uint32_t *)(0x420…

SQL优化之诊断篇:快速定位生产性能问题实践

1.优化背景 用户提交一个 SQL 作业后,一方面是希望作业能够成功运行,另一方面,对于成功完成的作业,需要进一步分析作业瓶颈,进行性能调优。针对这两个方面的需求,本文将介绍如何解决作业运行时的常见问题、…

C语言刷题训练DAY.11

1.有序序列插入一个整数 解题思路: 这里我们采用从后向前的比较法,如果最后面的数字比N大,我们就把这个数字向后移动一位,就比如把下标为3的数据移动到下标为4的位置。 注意:可能有一个数字是整个数组里面最小的&#…

无涯教程-PHP - 移除的扩展

以下扩展已从PHP 7开始删除- eregmssqlmysqlsybase_ct 以下SAPI已从PHP 7开始删除- aolserverapacheapache_hooksapache2filtercaudiumcontinuityisapimilternsapiphttpdpi3webroxenthttpdtuxwebjames PHP - 移除的扩展 - 无涯教程网无涯教程网提供以下扩展已从PHP 7开始删除…

UnionTech OS(统信桌面操作系统)安装 g++ 和 cmake

文章目录 前言一、debian 10简介二、安装 g三、安装cmake参考资料 前言 统信桌面操作系统支持x86、龙芯、申威、鲲鹏、飞腾、兆芯等国产CPU平台,基于debian 10.x 的稳定版本,长期维护的统一内核版本(4.19)。 一、debian 10简介 Debian 10 是一款广泛使…

Java 对图片进行上传或下载后发生了90度的旋转

一、背景介绍 在开发给上传图片打水印的时候,发现了一个奇怪的事情。某张图片在上传后发生了90度的旋转,但是在window打开来是竖的,上传后在打开就是横的。后来上网查询是由于手机在拍摄时候是横着拍的,在图片处理时将旋转角度存…

postman接口参数化设置

为什么需要参数化? 我们在做接口测试的过程中,会遇到需要测试同一个接口使用不同的数据的情况,如果每次去一个个填写数据就太麻烦了,这时我们就需要用到接口参数化,我们把数据单独的存放在一个文件中管理,…

一生一芯8——在github上添加ssh key

为在github上下载代码框架,这里在github上使用ssh key进行远程连接,方便代码拉取 参照博客https://blog.csdn.net/losthief/article/details/131502734 本机 系统ubuntu22.04 git 版本2.34.1 本人是第一次配置,没有遇到奇奇怪怪的错误&…

AI绘画:SDXL版ControlNet模型和使用方法!

SDXL是目前最强的AI绘画基础模型,直接加载模型,就可以生成不错的效果。但是它有一个致命的问题,就是不支持ControlNet。 在AI绘画中,ControlNet是一个非常重要的工具。有了它,就可以生成更加可控精准的图片。ControlN…

贪心算法:简单而高效的优化策略

在计算机科学中,贪心算法是一种简单而高效的优化策略,用于解决许多组合优化问题。虽然它并不适用于所有问题,但在一些特定情况下,贪心算法能够产生近似最优解,而且计算成本较低。在本文中,我们将深入探讨贪…

linux————LVS集群

目录 一、集群概述 一、负载均衡技术类型 二、负载均衡实现方式 二、LVS结构 一、三层结构 二、架构对象 三、LVS工作模式 四、负载均衡算法 一、静态负载均衡 二、动态负载 五、ipvsadm命令详解 六、LVS配置 一、基础配置 二、实现NAT模型搭建 配置IP地址 安装…

Python入门教程 | Python3 基本数据类型

赋值 Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。 在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。 等号(&#xff…