SpringBoot 中多例模式的神秘世界:用法区别以及应用场景,最后的灵魂拷问会吗?- 第519篇

历史文章(文章累计500+)
《国内最全的Spring Boot系列之一》
《国内最全的Spring Boot系列之二》
《国内最全的Spring Boot系列之三》
《国内最全的Spring Boot系列之四》
《国内最全的Spring Boot系列之五》
《国内最全的Spring Boot系列之六》
《国内最全的Spring Boot系列之七》
一文讲清楚SpringBoot项目打包jar后运行报错template might not exist - 第514篇
idea springboot woff/woff2/eot/ttf/svg等小图标不显示的问题 - 第515篇
Noisee AI中文站网页版 AI 音乐生成视频全新登场,快来抢先体验——国内第一个登场的中文站来袭 - 516篇
Spring的SmartLifecycle可以没用过,但没听过就不好了!- 第517篇
SpringBoot异常处理机制之自定义404、500错误提示页面 - 518篇
悟纤:师傅,你看看,我写了一个Redis的阻塞队列的通用服务,一开始一个开发接入我这个服务的时候,运行的很正常;当有另外一个开发也接入的时候,就会出现一些数据被另外一个改的现象。

师傅:你这个应该是在服务当中定义了一些配置的属性,这些属性对于某个场景是不变的;当另外一个场景是其它的配置了。
悟纤:师傅,不要这样子,感觉你就像我肚子里的蛔虫,怎么我还没告诉你,你就都不知道了。

师傅:你这个不用是蛔虫,都能猜到,这里说明你对于Spring Boot有些知识还了解的不够透彻。要回来深造下了,O(∩_∩)O哈哈~
悟纤:那师傅赶紧给我深造深造~,我要钱多多,我要买车车,我要变美变瘦变酷酷…

导读
最近在开发一个AI音乐项目(地址在下面)的时候,有个场景应用到了Redis的阻塞队列,一开始只在一个地方进行使用,后来有增加了一个新的应用场景,又引入了一下,就导致里面的属性信息,比如队列名称,阻塞队列对象,比较Comparator构造器,在两个业务上数据就被共用了,但是这又不是我所期望的发生的,那么这个时候要怎么办呢?
有粉丝会有疑问:阻塞队列,Java中不是有并发编程的各种队列,
ConcurrentLinkedDeque、LinkedBlockingQueue、DelayQueue,如果你的数据不牵涉到集群的问题,那么你用java提供的这些库进行开发就好了,但是如果数据要集群问题的,那么就不能这么干了。
回到上面一开始提出的问题,我们要怎么办以及要怎么思考呢?带着疑问和博主一起来探讨和学习一下。
项目体验地址:
https://suno4.cn/#/?i=8NCBS8_WXTT

一、SpringBoot的单例模式
Spring Boot的bean默认注入是单例的,它在Spring容器初始化的时候创建对象;
每次调用单例类的实例对象时,都获得同一个对象。
为什么用单例多例:
之所以用单例,是因为没必要每个请求都新建一个对象,这样子既浪费CPU又浪费内存;可以保证系统中一个类只有一个实例而且该实例和外界通信,解约资源,便于维护;当前需要频繁访问一个对象,可以用单例,避免创建过多的垃圾
二、SpringBoot的多例模式
多例模式:每次调用多例类的实例对象时,会获取到不同的对象(会自建新的对象)。
为什么用多例模式:
之所以用多例,是为了防止并发问题;即一个请求改变了对象的状态,此时对象又处理另一个请求,而之前请求对对象状态的改变导致了对象对另一个请求做了错误的处理。
用单例和多例的标准只有一个:当对象含有可改变的状态时(更精确的说就是在实际应用中该状态会改变),则多例,否则单例;
单例和多例的最大的区别:每次获取的美女是同一个就是单例,每次获取的美女都不一样,那么就是多例。

三、多例模式的使用和失效分析
对于Spring Boot默认情况下是单例的,也就是说,你使用了Spring Boot的注解,@Service、@Componment等注解注入的bean都是单例的,那么这个时候要设置为多例的,只需要在类上添加一个注册@Scope,属性值为:prototype,如下代码:
@Service@Scope(value = "prototype")public class MyService {
但我更希望你这么使用:
@Service@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)public class MyService {
对于这里的value值,可配置的值如下:
(1)ConfigurableBeanFactory.SCOPE_PROTOTYPE,即“prototype”: singleton代表多例。
(2)ConfigurableBeanFactory.SCOPE_SINGLETON,即“singleton” : singleton代表单例。
(3)WebApplicationContext.SCOPE_REQUEST,即“request”: request表示请求,即在一次http请求中,被注解的Bean都是同一个Bean,不同的请求是不同的Bean。
(4)WebApplicationContext.SCOPE_SESSION,即“session”: session表示会话,即在同一个会话中,被注解的Bean都是使用的同一个Bean,不同的会话使用不同的Bean。
为什么我的多例不好使?
为什么明明设置了@Scope(value=”prototype”)的属性,仍然不好使呢?这个就和一些用法上有关系了。
多例模式在进行注入时,不能使用 @Autowired,否则注入的还是单例模式,实现多例模式需要使用工厂模式;
@Autowired 在项目启动时已经将bean实例注入到引用类的成员变量中,因此在调用时是直接引用了已被初始化的成员变量,不会再从bean工厂中获取,因此没办法实现多例。也就是说多例模式,必须从bean工厂获取bean才能够实现。
多例获取方式
注入BeanFactory对象,调用其getBean方法即可:
@Autowiredprivate BeanFactory factory;// 此时得到的对象即为多例MyService myService = factory.getBean(MyService.class);
三、我的情况
那这个单例和多例和我们一开始提出的问题有何关联关系呢?
我们的代码是定义了一些属性属性,如下:
@Servicepublic class RedisBlockingService {@Autowiredprivate RedissonClient redissonClient;private String queueName;private RBlockingQueue blockingQueue;private Comparator comparator;}
这些属性信息,针对不同的业务场景应该会有不同的配置信息,比如针对音乐场景,那么就是音乐创作的队列信息,如果是视频创作,那么就是视频的队列信息。
那么这个时候,第二个后创建的就会把第一个创建的属性给覆盖掉,因为默认是单例的,也是在创建的时候,这些信息会随着单例一起构造出来。
所以这个时候就要使用多例来进行创建,以此来确保针对不同的业务场景,属性值不一样,如下代码:
@Service@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)public class RedisBlockingService {@Autowiredprivate RedissonClient redissonClient;private String queueName;private RBlockingQueue blockingQueue;private Comparator comparator;}
四、灵魂拷问
如下代码:
@Autowiredprivate RedisBlockingService redisBlockingService;@Autowiredprivate RedisBlockingService redisBlockingService1;
以上两个对象是否是同一个对象?(测试对应的Spring Boot版本2.5+)

历史文章(文章累计500+)
《国内最全的Spring Boot系列之一》
《国内最全的Spring Boot系列之二》
《国内最全的Spring Boot系列之三》
《国内最全的Spring Boot系列之四》
《国内最全的Spring Boot系列之五》
《国内最全的Spring Boot系列之六》
《国内最全的Spring Boot系列之七》
ES全文检索[ES系列] - 第508篇
ES 深度分页问题及针对不同需求下的解决方案[ES系列] - 第509篇
抖音主播/电商人员有福了,利用Suno创作产品宣传,让产品动起来-小米Su7 - 第510篇
Spring Boot整合ElasticSearch实战 - 第511篇
Transaction rolled back because it has been marked as - 第512篇
五音不全也浪漫,521清华学霸为爱人写歌 - 第513篇
一文讲清楚SpringBoot项目打包jar后运行报错template might not exist - 第514篇
idea springboot woff/woff2/eot/ttf/svg等小图标不显示的问题 - 第515篇
Noisee AI中文站网页版 AI 音乐生成视频全新登场,快来抢先体验——国内第一个登场的中文站来袭 - 516篇
Spring的SmartLifecycle可以没用过,但没听过就不好了!- 第517篇
SpringBoot异常处理机制之自定义404、500错误提示页面 - 518篇
相关文章:
SpringBoot 中多例模式的神秘世界:用法区别以及应用场景,最后的灵魂拷问会吗?- 第519篇
历史文章(文章累计500) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《…...
基于STM32设计的智能婴儿床(ESP8266局域网)_2024升级版_180
基于STM32设计的智能婴儿床(采用STM32F103C8T6)(180) 文章目录 一、设计需求【1】项目功能介绍【2】程序最终的运行逻辑【3】硬件模块组成【4】ESP8266模块配置【5】上位机开发思路【6】系统功能模块划分1.2 项目开发背景1.3 开发工具的选择1.4 系统框架图1.5 系统原理图1.6 硬…...
C++(第四天----拷贝函数、类的组合、类的继承)
一、拷贝构造函数(复制构造函数) 1、概念 拷贝构造函数,它只有一个参数,参数类型是本类的引用。如果类的设计者不写拷贝构造函数,编译器就会自动生成拷贝构造函数。大多数情况下,其作用是实现从源对象到目…...
第一课:接口配置IP地址:DHCP模式
希望pc1,pc2,pc3自动分配到ip地址。 实验拓扑: 配置:高级一点的路由器还是手动配置: [R1]int g0/0/0 [R1-g0/0/0]ip address 192.168.1.1 255.255.255.0 打开PC1,切换到DHCP模式,点击应用,再到命令行输入ipconfig&…...
esp32_spfiffs
生成 spiffs image python spiffsgen.py <image_size> <base_dir> <output_file> eg, python spiffsgen.py 0x2000 ./folder hello.bin Arduino 的库有例子可以直接用于 OTA 升级 spiffs 分区 HTTPUpdateResult HTTPUpdate::updateSpiffs(HTTPClient &h…...
每日一练全新考试模式解锁|考试升级
🙋频繁有小伙伴咨询:我想举办一场历时一个月的答题活动,学生可以每天打开答题,活动完结后可以导出每天的答题成绩 此前我们都会让小伙伴创建30场考试,然后使用批量分享功能组合起来,对外分享一个链接就可以…...
pyqt5图片分辨率导致的界面过大的问题
项目场景:pyqt5的图片分辨率和屏幕分辨率问题 提示:这里简述项目相关背景:图片分辨率:500*500;显示屏分辨率:600;导致界面显示不全; 在其他高分辨率显示屏中没有这个问题。 问题描述…...
(三)前端javascript中的数据结构之集合
集合的特点 1.无序 2.唯一性 3.不可重复 集合相对于前面几种数据结构,比较简单好理解,看看代码实现就能知道他的用法了 集合的创建 function MySet() {this.item {}; } MySet.prototype.has function (value) {return value in this.item; };//增 M…...
VuePress 的更多配置
现在,读者应该对 VuePress、主题和插件等有了基本的认识,除了插件,VuePress 自身也有很多有用的配置,这里简单说明下。 VuePress 的介绍 在介绍了 VuePress 的基本使用、主题和插件的概念之后,我们再来看看官…...
问题解决|Python 代码的组织形式与编码规范
一、Python中组织形式 (一)组织形式(函数,类,模块,包,库)概览 (1)概览 组织形式描述特点或用途例子函数一段具有特定功能的代码块,可以接受参数…...
Flask项目搭建及部署 —— Python
flask搭建及部署 pip 19.2.3 python 3.7.5 Flask 1.1.1 Flask-SQLAlchemy 2.4.1 Pika 1.1.0 Redis 3.3.11 flask-wtf 0.14.2 1、创建flask项目: 创建完成后整个项目结构树: app.py: 项⽬管理⽂件,通过它管理项⽬。 static: 存放静态…...
【C++报错已解决】Invalid Use of ‘this’ Pointer
🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 引言 一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:修正‘this’指针使用2…...
群晖NAS配置WebDav服务结合内网穿透实现跨平台云同步思源笔记
文章目录 前言1. 开启群晖WebDav 服务2. 本地局域网IP同步测试3. 群晖安装Cpolar4. 配置远程同步地址5. 笔记远程同步测试6. 固定公网地址7. 配置固定远程同步地址 前言 本教程主要分享如何将思源笔记、cpolar内网穿透和群晖WebDav三者相结合,实现思源笔记的云同步…...
内容监管与自由表达:Facebook的平衡之道
在当今数字化信息社会中,社交媒体平台不仅是人们交流和获取信息的主要渠道,也是自由表达的重要舞台。Facebook,作为全球最大的社交网络平台,连接了数十亿用户,形成了一个丰富多样的信息生态。然而,如何在维…...
电脑桌面日历记事本怎么弄 好用的桌面日历记事本
在这个数字化的时代,电脑已成为我们日常生活中不可或缺的伙伴。我常常在电脑上记录各种事项,以便随时查看和提醒自己。而我最钟爱的记事方式,莫过于使用桌面日历记事本。 想象一下,你的电脑桌面上有一个直观的日历,每…...
#招聘数据分析#2024年6月前程无忧招聘北上广深成渝对比情况
#招聘数据分析#2024年6月前程无忧招聘北上广深成渝对比情况 0、根据前程无忧不完全样本统计,北上广深成都重庆平均月工资从高到低依次为 北京15441元、上海14425元、深圳13310元、广州11192元、成都10539元、重庆10290。 1、成都招聘样本数全量35228个,…...
STM32 IIC详解(软件模拟)
目录 一、IIC协议基本原理 1.IIC协议概述 2.时序图分析 二、代码分析 1.IIC初始化 2.IIC起始信号 3.IIC发送数据 4.获取应答信号 5.读一个字节 6.产生ACK应答 7.不产生ACK应答 IIC(Inter-Integrated Circuit)在嵌入式系统中是一种常见的数据通…...
推三返一小程序商城开发搭建
推三返一小程序商城开发主要涉及到以下几个步骤: 确定需求和功能: 首先需要明确小程序商城的开发需求和功能。商家需要思考自己想要实现什么功能,例如推广、销售、裂变等。 同时还需要考虑小程序的页面设计、用户体验等方面。 选择合适的开…...
项目机会:4万平:智能仓,AGV,穿梭车,AMR,WMS,提升机,机器人……
导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 如下为近期国内智能仓储物流相关项目的公开信息线索,这些项目具体信息会发布到知识星球,请感兴趣的球友先人一步到知识星球【智能仓储物流技术研习社】自行下载…...
[工具类]Java 合并、拆分PPT幻灯片
本文将介绍在Java程序中如何来合并及拆分PPT文档的方法。示例大纲: 1. 合并 1.1 将指定幻灯片合并到文档 1.2 合并多个幻灯片文档为一个文档 2. 拆分 2.1 按幻灯片每一页单独拆分为一个文档 2.2 按指定幻灯片页数范围来拆分为多个文档 使用工具:F…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
