SpringBoot当中的Singleton和Prototype详解

在Spring Boot中,Singleton和Prototype是两种Bean的作用域。这两种作用域决定了Spring容器如何创建和管理Bean的实例。

  1. Singleton(单例):

    • 当一个Bean被配置为Singleton作用域时,Spring容器在启动时只会创建该Bean的一个实例,并在后续的所有请求中共享这个单例实例。
    • 这是默认的作用域,如果你没有明确指定Bean的作用域,那么Spring会默认将其作为Singleton处理。
    • 对于无状态或者线程安全的Bean,通常选择Singleton作用域,因为这样可以提高性能并减少内存消耗。
  2. 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的实例化策略和生命周期管理。

  1. 类上修饰@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注解。

  1. Spring注入的类重复调用对应的方法是活创建多个实例还是永远是一个实例?

在Spring中,对象的创建和管理是由Spring容器负责的。对于注入的类,如果它们被配置为Singleton作用域(这是默认的作用域),那么无论你如何多次调用该类的方法,Spring容器只会创建一个实例,并在所有需要的地方共享这个单例实例。

如果你将类配置为Prototype作用域,那么每次请求都会创建一个新的实例。在这种情况下,即使你调用的是同一个方法,但如果是在不同的实例上进行的,那么该方法就会被多个类实例分别调用。

所以,是否创建多个类实例取决于你在Spring配置中设置的作用域。对于Singleton作用域,永远都是同一个类实例;而对于Prototype作用域,每次请求都会创建一个新的类实例。

  1. 如果修改类当中的变量的值。其他地方调用这个值会变吗

这取决于类的作用域和变量的访问修饰符。

如果类被配置为Singleton作用域,并且变量是实例变量(非static),那么当在一个地方修改该变量的值时,其他地方调用这个变量时会看到更改后的值,因为整个应用中只有一个共享的实例。

如果类被配置为Prototype作用域,每次请求都会创建一个新的实例。因此,如果在一个实例中修改变量的值,其他实例中的相同变量不会受到影响,因为它们是独立的对象。

对于静态变量(static),无论类的作用域如何,所有实例共享同一个静态变量。所以,如果在一个地方修改静态变量的值,所有地方调用这个静态变量时都会看到更改后的值。

对于局部变量(在方法内部定义的变量),它们只在该方法的上下文中存在,修改局部变量的值不会影响到其他方法或实例中的变量。

总的来说,变量的可见性和变化范围取决于它的作用域(静态或实例)、类的作用域(Singleton或Prototype)以及访问修饰符(public、private、protected等)。

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

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

相关文章

Spring Boot 入参校验及全局异常处理

版本依赖 JDK 17 Spring Boot 3.2.0 源码地址&#xff1a;Gitee Spring Boot validation spring-boot-starter-validation是基于hibernate-validator的实现&#xff0c;在Spring Boot项目中直接导入spring-boot-starter-validation即可。 Valid 和 Validated 的区别 适用范围…

《对话品牌》——活到老“养”到老

本期节目《对话品牌》栏目组邀请到了深圳壹常青健康管理有限公司董事长邬锡娣女士参加栏目录制&#xff0c;分享其企业故事&#xff0c;树立品牌形象&#xff0c;提升品牌价值&#xff01; 节目嘉宾&#xff1a;邬锡娣女士 节目主持人&#xff1a;董倩 节目播出平台&#xf…

在线教育系统源码解读:定制化企业培训APP的开发策略

当下&#xff0c;企业培训正经历着一场数字化的迭代&#xff0c;定制化企业培训APP应运而生&#xff0c;成为提升员工技能、推动企业发展的重要工具。下文小编将与大家一同深入了解在线教育系统的源码&#xff0c;探讨开发定制化企业培训APP的策略&#xff0c;以满足不同企业的…

C#获取windows系统资源使用情况

1.前言 之前有一篇博客介绍如何获取Linux服务器上的资源使用情况《Java 获取服务器资源&#xff08;内存、负载、磁盘容量&#xff09;》&#xff0c;这里介绍如何通过C#获取Window系统的资源使用。 2.获取服务器资源 2.1.内存 [DllImport("kernel32.dll")][retu…

jenkins解决工具找不到的问题

--------------------------插件选择版本最好能跟服务器对上

香橙派5plus从ssd启动Ubuntu

官方接口图 我实际会用到的就几个接口&#xff0c;背面的话就一个M.2固态的位置&#xff1a; 其中WIFI模块的接口应该也可以插2230的固态&#xff0c;不过是pcie2.0的速度&#xff0c;背面的接口则是pcie3.0*4的速度&#xff0c;差距还是挺大的。 开始安装系统 准备工作 一张…

常用入门算法

一&#xff1a;快慢指针 适合原地调换一个数组的元素们的位置&#xff0c;使用for循环&#xff0c;声明两个下标&#xff0c;一个移的快&#xff0c;一个移的慢。 快的指针用来往前走&#xff0c;慢的用来停在目标数据上。典型的案例&#xff1a;283. 移动零 1、给定一个数组…

C语言中关于switch语句的理解

首先我们来看一下switch的定义 switch&#xff08;整型表达式&#xff09; { case 整型常量表达式: 语句&#xff1b; } 我们在书写时要注意一下&#xff0c;无论是在switch还是case&#xff0c;后面跟着的都一定要是整型&#xff0c;而且case这一行写完时&#xff0c;最后要用…

图片放大后变模糊了怎么办?这个方法惊艳你

我们需要了解为什么图片放大会模糊。在照片放大时&#xff0c;像素也会随之增加。如果图片的像素不足&#xff0c;那么放大后每个像素的大小也会增加&#xff0c;从而导致细节模糊。 那么&#xff0c;面对这个问题&#xff0c;我们该如何解决呢&#xff1f;别急&#xff0c;让…

MySQL 数据页损坏处理思路

文章目录 前言1. 备份恢复2. 强制 InnoDB 恢复2.1 损坏数据页2.2 观察错误日志2.3 设置参数2.4 定位表信息2.5 分析处理2.6 恢复数据 总结 前言 研发自己搭建了一套 MySQL 没有设置双一参数&#xff0c;机房异常断电&#xff0c;导致数据页出现损坏&#xff0c;本篇文章介绍此…

狗笼,预计2028年将以 6.2%的复合年增长率增长

对于想要为爱犬提供安全舒适空间的宠物主人来说&#xff0c;狗笼是必不可少的宠物配件。由于宠物主人的数量不断增加以及人们对宠物安全和福祉的意识不断增强&#xff0c;狗笼市场一直在稳步增长。 全球市场分析&#xff1a;全球狗笼市场预计从 2021 年到 2028 年将以 6.2% 的复…

【C语言】动态内存管理详解

文章目录 前言动态内存管理出现的原因malloc函数和free函数函数原型使用 calloc函数和realloc函数函数原型使用 动态内存使用中容易出现的错误柔性数组总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 动态内存管理是C语言中一项重要的编程任务&…

axios配置请求头content-type 和 get/post请求方式

axios配置请求头content-type https://blog.csdn.net/wojiushiwo945you/article/details/107653962 axios 是Ajax的一个插件&#xff0c;axios虽然是一个插件&#xff0c;但是我们不需要通过Vue.use(axios)来使用&#xff0c;下载完成后&#xff0c;只需在项目中引入即可。(一…

PHP文件上传以及数据写入

文件打开和数据写入 在PHP中&#xff0c;可以通过使用fopen()函数来打开一个文件。它接受两个参数&#xff1a;文件路径和打开模式。打开模式可以是"r"&#xff08;只读&#xff09;, "w"&#xff08;写入&#xff0c;如果文件不存在则创建文件&#xff0…

NFC刷卡soc芯片SI3262集成刷卡+触摸+ACD超低功耗一体

简介 13.56mhz刷卡soc芯片SI3262集成刷卡触摸ACD超低功耗&#xff0c;ACD模式刷卡距离可达到5cm以上&#xff0c;非常适用于小体积门锁&#xff0c;密码锁&#xff0c;柜锁&#xff0c;接下来介绍一下这款芯片的具体功能。 优势 1.超低功耗&#xff0c;最低功耗达 1.7uA&…

揭秘跨境电商ERP源码定制化需求及最佳实践

跨境电商ERP源码的定制化需求是跨境电商企业在整个ERP系统开发实施过程中需要重点关注的问题之一。本文将围绕跨境电商ERP源码定制化的需求和最佳实践展开深入探讨&#xff0c;为行业内的从业者和相关人士提供一些建议和思路。 定制化需求 跨境电商ERP的业务特点决定了对源码…

RivaGAN 水印项目

git地址 https://github.com/DAI-Lab/RivaGAN Dockerfile (/tools下文件为git下的文件) ############################################### # 使用 NVIDIA CUDA 10.0 开发环境作为基础镜像 FROM kaldiasr/kaldi:gpu-ubuntu18.04-cuda10.0 # 设置非交互式安装模式以避免某些命…

Vue 模板编译原理

Vue 模板编译原理是指将 Vue 的模板转换为渲染函数的过程。在 Vue 中&#xff0c;模板被定义为 HTML 代码片段或者在 .vue 单文件组件中定义。当 Vue 实例化时&#xff0c;会将模板编译为渲染函数&#xff0c;该函数可以根据组件的状态生成虚拟 DOM 并更新视图。 Vue 的模板编…

8.小明和完美序列

题目 import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();sc.nextLine();Map<Integer,Intege…

Spring HTTP请求与应答国密算法加解密(对称加密方式SM4)

SM4算法成为行业标准: SM4分组密码算法是2012年3月21日实施的一项行业标准;2021年6月25日,我国SM4分组密码算法作为国际标准ISO/IEC 18033-3:2010/AMD1:2021《信息技术 安全技术 加密算法 第3部分:分组密码 补篇1:SM4》,由国际标准化组织ISO/IEC正式发布;中文名SM4分组…