当前位置: 首页 > news >正文

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等)。

相关文章:

SpringBoot当中的Singleton和Prototype详解

在Spring Boot中&#xff0c;Singleton和Prototype是两种Bean的作用域。这两种作用域决定了Spring容器如何创建和管理Bean的实例。 Singleton&#xff08;单例&#xff09;&#xff1a; 当一个Bean被配置为Singleton作用域时&#xff0c;Spring容器在启动时只会创建该Bean的一个…...

LeetCode第1题 - 两数之和

题目 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;你不能重复利用这个数组中同样的元素。 示例 给定 nums [2, 7, 11, 15], …...

(14)Linux 地址空间的理解

前言&#xff1a;本章核心主题为 "进程地址空间"。 一、Linux 进程地址空间 程序地址空间是内存吗&#xff1f;不是&#xff01;程序地址空间不是内存&#xff01; 其实&#xff0c;我们称之为程序地址空间都不准确&#xff0c;应该叫 进程地址空间&#xff0c;这…...

Java中的设计模式

设计模式是软件开发中常见问题的可重用解决方案。在Java中&#xff0c;设计模式有助于提高代码的可维护性、可读性和可扩展性。以下是一篇关于Java中设计模式的文章&#xff0c;以帮助您更好地理解这些模式。 一、设计模式简介 设计模式是经过验证的解决方案&#xff0c;用于…...

Hadoop(2):常见的MapReduce[在Ubuntu中运行!]

1 以词频统计为例子介绍 mapreduce怎么写出来的 弄清楚MapReduce的各个过程&#xff1a; 将文件输入后&#xff0c;返回的<k1,v1>代表的含义是&#xff1a;k1表示偏移量&#xff0c;即v1的第一个字母在文件中的索引&#xff08;从0开始数的&#xff09;&#xff1b;v1表…...

Unity | 快速修复Animation missing错误

目录 一、背景 二、效果 三、解决办法 一、背景 最近在做2D 骨骼动画相关的Demo&#xff0c;我自己使用Unity引擎进行骨骼绑定并创建了anim后&#xff0c;一切正常&#xff0c;anim也能播放。但是昨天我修改Obj及子物体的名称&#xff08;由中文改为英文&#xff0c;如&…...

ssm基于web的志愿者管理系统的设计与实现+vue论文

摘 要 使用旧方法对志愿者管理系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在志愿者管理系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开发的志愿者…...

C++运算符重载(插入and提取)

介绍 本文主要介绍 插入(>>) and 提取(<<)的运算符重载 1.插入(>>) 提取(<<)只能是友元函数 2.插入关键词istream 例子&#xff1a;istream& operator>>(istream& in, sumber&Left) 3.提取关键词ostream 例子&#xff1a;ostream&a…...

C#高级 08Json操作

1.概念 Json是存储和交换文本信息的语法。类似于XML。Json比XML更小、更快、更易解析。Json与XML一样是一种数据格式。Json是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。Json采取完全独立于语言的文本格式&#xff0c; 但是也使用了类似于C语言的习惯。这些特性使…...

封装uniapp签字板

新开发的业务涉及到签字功能&#xff0c;由于是动态的表单&#xff0c;无法确定它会出现在哪里&#xff0c;不得已封装模块。 其中涉及到一个难点就是this的指向性问题&#xff0c; 第二个是微信小程序写法&#xff0c; 我这个写法里用了u-view的写法&#xff0c;可以自己修改组…...

Mybatis行为配置之Ⅳ—日志

专栏精选 引入Mybatis Mybatis的快速入门 Mybatis的增删改查扩展功能说明 mapper映射的参数和结果 Mybatis复杂类型的结果映射 Mybatis基于注解的结果映射 Mybatis枚举类型处理和类型处理器 再谈动态SQL Mybatis配置入门 Mybatis行为配置之Ⅰ—缓存 Mybatis行为配置…...

Java设计模式-外观模式

目录 一、影院管理项目 二、外观模式 &#xff08;一&#xff09;基本介绍 &#xff08;二&#xff09;原理类图 &#xff08;三&#xff09;解决影院管理 &#xff08;四&#xff09;注意事项和细节 &#xff08;五&#xff09;外观模式在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的包管理&#xff0c;经过社区和官方的共同努力下&#xff0c;最终在百家争鸣后Go官方在 2018.8 推出了go 1.11版本中的Go Modules&#xff0c;并且很快成为一统江湖的包…...

【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视频监控平台的时候&#xff0c;有的客户经常会配置错误IP地址的掩码和网关&#xff0c;导致出现一些网路问题。而在视频监控系统中&#xff0c;IP地址和子网掩码是用于标识网络中设备的重要标识符。IP地址被用来唯一地标识一个网络设备&#xff0c;…...

代码随想录刷题 | Day1

今日学习目标 一、基础 数组 array类 模板类vector 数组是存放在连续内存空间上的相同类型数据的集合。 数组可以方便的通过下标索引的方式获取到下标下对应的数据。 需要两点注意的是 数组下标都是从0开始的。 数组内存空间的地址是连续的 而且大家如果使用C的话&…...

查看IOS游戏FPS

摘要 本篇技术博客将介绍如何使用克魔助手工具来查看iOS游戏的帧率&#xff08;FPS&#xff09;。通过克魔助手&#xff0c;开发者可以轻松监测游戏性能&#xff0c;以提升用户体验和游戏质量。 引言 在iOS游戏开发过程中&#xff0c;了解游戏的帧率对于优化游戏性能至关重要…...

挑战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案例)

目录 文章声明⭐⭐⭐让我们开始今天的学习吧&#xff01;TodoList小案例 文章声明⭐⭐⭐ 该文章为我&#xff08;有编程语言基础&#xff0c;非编程小白&#xff09;的 HarmonyOS自学笔记&#xff0c;此类文章笔记我会默认大家都学过前端相关的知识知识来源为 HarmonyOS官方文…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

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.…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...