SpringBoot当中的Singleton和Prototype详解
在Spring Boot中,Singleton和Prototype是两种Bean的作用域。这两种作用域决定了Spring容器如何创建和管理Bean的实例。
-
Singleton(单例):
- 当一个Bean被配置为Singleton作用域时,Spring容器在启动时只会创建该Bean的一个实例,并在后续的所有请求中共享这个单例实例。
- 这是默认的作用域,如果你没有明确指定Bean的作用域,那么Spring会默认将其作为Singleton处理。
- 对于无状态或者线程安全的Bean,通常选择Singleton作用域,因为这样可以提高性能并减少内存消耗。
-
Prototype(原型):
- 当一个Bean被配置为Prototype作用域时,每次通过Spring容器请求该Bean时,都会创建一个新的实例。
- 这意味着对于每个请求或依赖注入,都会生成一个新的对象,每个对象之间是独立的,修改一个实例的状态不会影响到其他实例。
- 对于有状态或者非线程安全的Bean,通常选择Prototype作用域,以确保每个请求都有自己的独立对象。
在Spring Boot中,你可以通过以下方式在Java配置或XML配置中指定Bean的作用域:
Java配置示例:
@Bean
@Scope("singleton") // 默认值,可以省略
public MySingletonBean mySingletonBean() {return new MySingletonBean();
}@Bean
@Scope("prototype")
public MyPrototypeBean myPrototypeBean() {return new MyPrototypeBean();
}
XML配置示例:
<bean id="mySingletonBean" class="com.example.MySingletonBean" scope="singleton" /><bean id="myPrototypeBean" class="com.example.MyPrototypeBean" scope="prototype" />
总的来说,Spring Boot中的Singleton和Prototype作用域与Spring框架中的行为是一致的,它们主要影响了Bean的实例化策略和生命周期管理。
- 类上修饰@Scope和方法上修饰@Scope的区别
在Spring中,@Scope注解用于定义Bean的作用域。当这个注解应用在类或方法上时,它们的主要区别在于作用的范围和影响的对象创建方式:
类上修饰@Scope:
当@Scope注解应用于类级别时,它会影响该类的所有实例。
例如,如果你将一个类标记为@Scope(“prototype”),那么每次请求或依赖注入该类的实例时,Spring容器都会创建一个新的对象。
方法上修饰@Scope(这种方法级别的作用域通常被称为“方法作用域”或“Scoped Proxy”):
当@Scope注解应用于方法级别时,它的效果通常与AOP(面向切面编程)代理一起使用。
在这种情况下,Spring会为这个方法创建一个代理对象,然后根据指定的作用域策略来管理这个代理对象的生命周期。
例如,如果你在一个配置类的方法上使用@Scope(“request”),那么每当一个新的HTTP请求到达时,Spring会为这个方法创建一个新的代理对象,并在这个请求的范围内共享这个对象。
需要注意的是,方法级别的@Scope通常不直接应用于业务类,而是应用于配置类中的@Bean方法。这是因为业务类通常不直接由Spring容器管理,而是通过配置类中的@Bean方法来定义和初始化。
总结起来,类上的@Scope影响整个类的所有实例,而方法上的@Scope主要用于定义特定方法的行为,并且通常与AOP代理一起工作,以实现更细粒度的作用域控制。在实际使用中,方法级别的作用域相对较少见,大多数情况下,我们会在类级别或者@Bean方法级别上使用@Scope注解。
- Spring注入的类重复调用对应的方法是活创建多个实例还是永远是一个实例?
在Spring中,对象的创建和管理是由Spring容器负责的。对于注入的类,如果它们被配置为Singleton作用域(这是默认的作用域),那么无论你如何多次调用该类的方法,Spring容器只会创建一个实例,并在所有需要的地方共享这个单例实例。
如果你将类配置为Prototype作用域,那么每次请求都会创建一个新的实例。在这种情况下,即使你调用的是同一个方法,但如果是在不同的实例上进行的,那么该方法就会被多个类实例分别调用。
所以,是否创建多个类实例取决于你在Spring配置中设置的作用域。对于Singleton作用域,永远都是同一个类实例;而对于Prototype作用域,每次请求都会创建一个新的类实例。
- 如果修改类当中的变量的值。其他地方调用这个值会变吗
这取决于类的作用域和变量的访问修饰符。
如果类被配置为Singleton作用域,并且变量是实例变量(非static),那么当在一个地方修改该变量的值时,其他地方调用这个变量时会看到更改后的值,因为整个应用中只有一个共享的实例。
如果类被配置为Prototype作用域,每次请求都会创建一个新的实例。因此,如果在一个实例中修改变量的值,其他实例中的相同变量不会受到影响,因为它们是独立的对象。
对于静态变量(static),无论类的作用域如何,所有实例共享同一个静态变量。所以,如果在一个地方修改静态变量的值,所有地方调用这个静态变量时都会看到更改后的值。
对于局部变量(在方法内部定义的变量),它们只在该方法的上下文中存在,修改局部变量的值不会影响到其他方法或实例中的变量。
总的来说,变量的可见性和变化范围取决于它的作用域(静态或实例)、类的作用域(Singleton或Prototype)以及访问修饰符(public、private、protected等)。
相关文章:
SpringBoot当中的Singleton和Prototype详解
在Spring Boot中,Singleton和Prototype是两种Bean的作用域。这两种作用域决定了Spring容器如何创建和管理Bean的实例。 Singleton(单例): 当一个Bean被配置为Singleton作用域时,Spring容器在启动时只会创建该Bean的一个…...
LeetCode第1题 - 两数之和
题目 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例 给定 nums [2, 7, 11, 15], …...
(14)Linux 地址空间的理解
前言:本章核心主题为 "进程地址空间"。 一、Linux 进程地址空间 程序地址空间是内存吗?不是!程序地址空间不是内存! 其实,我们称之为程序地址空间都不准确,应该叫 进程地址空间,这…...
Java中的设计模式
设计模式是软件开发中常见问题的可重用解决方案。在Java中,设计模式有助于提高代码的可维护性、可读性和可扩展性。以下是一篇关于Java中设计模式的文章,以帮助您更好地理解这些模式。 一、设计模式简介 设计模式是经过验证的解决方案,用于…...
Hadoop(2):常见的MapReduce[在Ubuntu中运行!]
1 以词频统计为例子介绍 mapreduce怎么写出来的 弄清楚MapReduce的各个过程: 将文件输入后,返回的<k1,v1>代表的含义是:k1表示偏移量,即v1的第一个字母在文件中的索引(从0开始数的);v1表…...
Unity | 快速修复Animation missing错误
目录 一、背景 二、效果 三、解决办法 一、背景 最近在做2D 骨骼动画相关的Demo,我自己使用Unity引擎进行骨骼绑定并创建了anim后,一切正常,anim也能播放。但是昨天我修改Obj及子物体的名称(由中文改为英文,如&…...
ssm基于web的志愿者管理系统的设计与实现+vue论文
摘 要 使用旧方法对志愿者管理系统的信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在志愿者管理系统的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。这次开发的志愿者…...
C++运算符重载(插入and提取)
介绍 本文主要介绍 插入(>>) and 提取(<<)的运算符重载 1.插入(>>) 提取(<<)只能是友元函数 2.插入关键词istream 例子:istream& operator>>(istream& in, sumber&Left) 3.提取关键词ostream 例子:ostream&a…...
C#高级 08Json操作
1.概念 Json是存储和交换文本信息的语法。类似于XML。Json比XML更小、更快、更易解析。Json与XML一样是一种数据格式。Json是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。Json采取完全独立于语言的文本格式, 但是也使用了类似于C语言的习惯。这些特性使…...
封装uniapp签字板
新开发的业务涉及到签字功能,由于是动态的表单,无法确定它会出现在哪里,不得已封装模块。 其中涉及到一个难点就是this的指向性问题, 第二个是微信小程序写法, 我这个写法里用了u-view的写法,可以自己修改组…...
Mybatis行为配置之Ⅳ—日志
专栏精选 引入Mybatis Mybatis的快速入门 Mybatis的增删改查扩展功能说明 mapper映射的参数和结果 Mybatis复杂类型的结果映射 Mybatis基于注解的结果映射 Mybatis枚举类型处理和类型处理器 再谈动态SQL Mybatis配置入门 Mybatis行为配置之Ⅰ—缓存 Mybatis行为配置…...
Java设计模式-外观模式
目录 一、影院管理项目 二、外观模式 (一)基本介绍 (二)原理类图 (三)解决影院管理 (四)注意事项和细节 (五)外观模式在MyBatis框架应用的源码分析 一…...
js+css实现颜色选择器
<!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>颜色选择器</title><style>.color-box {width: 50px;height: 50px;border: 1px solid #000;cursor: pointer;}</style> </head> <body><…...
Go语言中的包管理工具之Go Modules的使用
GoLang 中常用的包管理的方式 常用的有三种 Go PathGo VendorGo Modules 关于 Go Modules 1 ) 概述 Go的包管理,经过社区和官方的共同努力下,最终在百家争鸣后Go官方在 2018.8 推出了go 1.11版本中的Go Modules,并且很快成为一统江湖的包…...
【c/c++】指针例图基础详解
文章目录 指针变量内存指针详解例1例2练习&答案解析 指针变量内存 int main(){// 各类型变量占字节数printf("char: %d\n",sizeof(char)); // 1printf("short: %d\n",sizeof(short)); // 2printf("int: %d\n",sizeof(int)); // 4pri…...
TCP/IP的网络层(即IP层)之IP地址和网络掩码,在视频监控系统中的配置和应用
在给客户讲解我们的AS-V1000视频监控平台的时候,有的客户经常会配置错误IP地址的掩码和网关,导致出现一些网路问题。而在视频监控系统中,IP地址和子网掩码是用于标识网络中设备的重要标识符。IP地址被用来唯一地标识一个网络设备,…...
代码随想录刷题 | Day1
今日学习目标 一、基础 数组 array类 模板类vector 数组是存放在连续内存空间上的相同类型数据的集合。 数组可以方便的通过下标索引的方式获取到下标下对应的数据。 需要两点注意的是 数组下标都是从0开始的。 数组内存空间的地址是连续的 而且大家如果使用C的话&…...
查看IOS游戏FPS
摘要 本篇技术博客将介绍如何使用克魔助手工具来查看iOS游戏的帧率(FPS)。通过克魔助手,开发者可以轻松监测游戏性能,以提升用户体验和游戏质量。 引言 在iOS游戏开发过程中,了解游戏的帧率对于优化游戏性能至关重要…...
挑战Python100题(7)
100+ Python challenging programming exercises 7 Question 61 Print a unicode string "hello world". Hints: Use ustrings format to define unicode string. 打印一个unicode字符串“helloworld”。 提示:使用u“字符串”格式定义unicode字符串。 Solution…...
HarmonyOS自学-Day4(TodoList案例)
目录 文章声明⭐⭐⭐让我们开始今天的学习吧!TodoList小案例 文章声明⭐⭐⭐ 该文章为我(有编程语言基础,非编程小白)的 HarmonyOS自学笔记,此类文章笔记我会默认大家都学过前端相关的知识知识来源为 HarmonyOS官方文…...
LTPI协议的理解——2、LTPI实现的底层架构
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 LTPI协议的理解——2、LTPI实现的底层架构 前言一、体系结构三、实现细节四、物理接口信号传输方法总结 前言 前面讲了LTPI的定义和大概结构,接下来继续理解LTPI…...
CentOS 8.2 安装 Mysql 5.7.26(单机)
Mysql二进制包: mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz 1、卸载旧环境 rpm -qa|grep mysql rpm -qa|grep mariadb rpm -e XXX.rpm --nodeps # 强制卸载rpm包 rm -rf /etc/my.cnf rm -rf /etc/mysql rm -rf /usr/local/mysql 2、安装依赖包 yum -y install libaio yum…...
Vue Tinymce富文本组件自定义带下拉框的操作按钮
想实现如下效果 首先在init方法中的props,toolbar属性增加一个自定义按钮 增加一个setup方法 代码 setup: function(editor) { editor.ui.registry.addSplitButton(myDateButton, {text: 日期时间,onAction: (_) > editor.insertContent(getJsMonthDay(getNowDat…...
YOLOv5算法进阶改进(10)— 更换主干网络之MobileViTv3 | 轻量化Backbone
前言:Hello大家好,我是小哥谈。MobileViTv3是一种改进的模型架构,用于图像分类任务。它是在MobileViTv1和MobileViTv2的基础上进行改进的,通过引入新的模块和优化网络结构来提高性能。本节课就给大家介绍一下如何在主干网络中引入MobileViTv3网络结构,希望大家学习之后能够…...
Java UDP
接收方 创建DatagramSocket实例并指定端口。创建DatagramPacket实例接收信息。调用DatagramSocket的receive()方法将接收信息并传递给DatagramPacket。通过DatagramPacket的getData()方法获取信息内容,getLength()方法获取长度。 package io.github.jast90.udp;im…...
Halcon阈值处理的几种分割方法threshold/auto_threshold/binary_threshold/dyn_threshold
Halcon阈值处理的几种分割方法 文章目录 Halcon阈值处理的几种分割方法1. 全局阈值2. 基于直方图的自动阈值分割方法3. 自动全局阈值分割方法4. 局部阈值分割方法5. var_threshold算子6 . char_threshold 算子7. dual_threshold算子 在场景中选择物体或特征是图像测量或识别的重…...
FB混合C语言编译
这是群友分享的方法,这里只是作为记录和分享。 有了这个功能,可以很方便的拷贝一下C或者C代码直接用到FB上。 既然是混合C语言编译,当然得有C的代码。比如随便去网上找两个排序:冒泡排序和选择排序,代码如下…...
【机器学习】深度学习概论(二)
五、受限玻尔兹曼机(Restricted Boltzmann Machine,RBM) 5.1 RBM介绍 示例代码: Python 编写了一个简单的 RBM 实现,并用一些假数据训练了它。然后,他展示了如何用 RBM 来解释用户的电影偏好,以…...
词法语法语义分析程序设计及实现,包含出错提示和错误恢复
词法说明 (1)关键字 main, int, char, if, else, for, while, void (2)运算符 - * / < < > > ! (3)界符 ; ( ) { } (4)标识符 ID letter(letter|digit)* (5)整型常数 NUM digit digit* (6)空格 ‘ ‘ ‘\n’ ‘\r’ ‘\t’ 空格用来分隔ID,NUM,运算符,界…...
Linux的capability深入分析
from:https://www.cnblogs.com/iamfy/archive/2012/09/20/2694977.html 一)概述: 1)从2.1版开始,Linux内核有了能力(capability)的概念,即它打破了UNIX/LINUX操作系统中超级用户/普通用户的概念,由普通用户也可以做只有超级用户可以完成的工作. 2)capability可以作用在进程上…...
太原优化网站排名/搜索引擎营销的特点有
在引入三方的aar包到项目的libs目录下,并且在对应的模块的build.gradle文件中引入后进行同步,然后报错如下: 根据报错日志中的信息,了解到应当是合并出现问题 显示自己的高德地图Key发生了冲突,经询问了解到aar包中集…...
asp动态网站设计/百度推广代理赚钱
电气原理图英语缩写 符号汇总 FANC 风扇控制信号 RELAYC 继电器控制信号 RTMP 温度信号 BRR 制动 NDC 地 P 正极 positive pole N 负极 negative pole B 制动 brake F 反馈 feedback L 火线 N 零线 即地线 CLK 时钟信号 Vpp峰峰值 Vcc 电源电压 Rms 有效值 Duty 占空比 Vdd 芯片…...
网站建设佰首选金手指二七/长春百度seo公司
原始地址:http://www.myhack58.com/Article/sort099/sort0100/2015/62781.htm 一、生成密钥 现在我们通过xshell生成密钥,注意:本章节,我只进行截图,不做进一步的文章说明。 如下: 我们现在有了公钥…...
专业建站公司服务/关键词排名提升工具
这是一个基于MVCDAO的留言管理系统,包含增删改查,其中查询,有全部查询和按关键字进行模糊查询的功能。文章底部附件是源码程序。大家共同学习,共同进步。具体如下: NoteDAO.java package cn.mldn.lxh.note.dao ;import…...
wordpress+刷新/怎么制作一个网页
作者:chris 来自:IBM 很多人用java进行文档操作时经常会遇到一个问题,就是如何获得word,excel,pdf等文档的内容?我研究了一下,在这里总结一下抽取word,pdf的几种方法。 1. 用jaco…...
微信开放平台是什么/常熟seo网站优化软件
1.请列举出在 JDK 中几个常用的设计模式? 单例模式(Singleton pattern)用于 Runtime,Calendar 和其他的一些类中。工厂模式(Factory pattern)被用于各种不可变的类如 Boolean,像 Boolean.value…...