Bean 的六种作用域
目录
一、作用域是什么?
1、singleton(单例作用域)
2、prototype(原型作用域)
3、request(请求作用域)
4、session(回话作用域)
5、application(全局作用域)
6、websocket( HTTP WebSocket 作用域)
二、单例作⽤域VS 全局作⽤域
三、设置作用域
一、作用域是什么?
Bean的作用域是指Bean实例的生命周期及可见性范围,Spring框架定义了以下6种作用域:
- singleton:单例作用域,所有对该Bean的请求都返回同一个Bean实例。
- prototype:原型作用域,每次请求时都创建一个新的Bean实例。
- request:请求作用域,每个HTTP请求都会创建一个新的Bean实例,该Bean实例仅在当前请求内有效。
- session:会话作用域,每个HTTP会话都会创建一个新的Bean实例,该Bean实例仅在当前会话内有效。
- application:全局作用域,一个
bean定义对应于单个ServletContext的生命周期。- websocket: HTTP WebSocket 作用域,一个
bean定义对应于单个websocket的生命周期。选择适当的作用域可以提高应用程序的性能和可维护性。
下面用一个例子来解释Bean的作用域:你和别人一起协同开发的代码中有个Bean不想别人改动,那就可以通过调整Bean的作用域来解决.
下面有两个用户张三和李四,张三呢 调用了公共对象,但是张三特意使用了 user2来接收,
此时李四也想使用这个对象;然后他们一起调用了,但是发现李四调用的时候这个Name也被修改成小猫了.这是为什么呢 张三明显创建了一个新对象
其实真实的情况是Spring的IoC容器有两种作用域模式,一种是IoC默认的singleton(单例作用域),一种是可手动修改的prototype(原型作用域 / 多例作用域),在默认情况下,IoC容器采用singleton,也就是所有人获取到的都是同一个Bean对象,这样效率会高很多.
所以当我们使用原型模式时这个问题就解决了
//张三
@Controller
public class UserController2 {@Autowiredprivate User user;public void doMethod() {User user2 = user;System.out.println("UserController2 修改之前:User -> " + user);user2.setName("小猫");System.out.println("UserController2 修改之后:User -> " + user);}}
//李四
@Controller
public class UserController3 {@Autowiredprivate User user;public void doMethod() {System.out.println("UserController3:user -> " + user);}}
1、singleton(单例作用域)
- 官⽅说明:(Default) Scopes a single bean definition to a single object instance for each Spring IoC container.
- 描述:该作⽤域下的Bean在IoC容器中只存在⼀个实例:获取Bean(即通过applicationContext.getBean等⽅法获取)及装配Bean(即通过@Autowired注⼊)都是同⼀个对象。
- 场景:通常⽆状态的Bean使⽤该作⽤域。⽆状态表示Bean对象的属性状态不需要更新
- 备注:Spring默认选择该作⽤域
2、prototype(原型作用域)
- 官⽅说明:Scopes a single bean definition to any number of object instances.
- 描述:每次对该作⽤域下的Bean的请求都会创建新的实例:获取Bean(即通过applicationContext.getBean等⽅法获取)及装配Bean(即通过@Autowired注⼊)都是新的对象实例。
- 场景:通常有状态的Bean使⽤该作⽤域

上图中,每个引用对应一个新的
bean实例。请注意,上图中的例子不适用于生产环境。因为
DAO通常来说是无状态的bean,应该指定它的作用域为singleton比较合适
3、request(请求作用域)
- 官⽅说明:Scopes a single bean definition to the lifecycle of a single HTTP request. That is, each HTTP request has its own instance of a bean created off the back of a single bean definition. Only valid in the context of a web-aware Spring ApplicationContext.
- 描述:每次http请求会创建新的Bean实例,类似于prototype
- 场景:⼀次http的请求和响应的共享Bean
- 备注:限定SpringMVC中使⽤
4、session(回话作用域)
- 官⽅说明:Scopes a single bean definition to the lifecycle of an HTTP Session. Only valid in the context of a web-aware Spring ApplicationContext.
- 描述:在⼀个http session中,定义⼀个Bean实例
- 场景:⽤户回话的共享Bean, ⽐如:记录⼀个⽤户的登陆信息
- 备注:限定SpringMVC中使⽤
5、application(全局作用域)
- 官⽅说明:Scopes a single bean definition to the lifecycle of a ServletContext. Only valid in the context of a web-aware Spring ApplicationContext.
- 描述:在⼀个http servlet Context中,定义⼀个Bean实例
- 场景:Web应⽤的上下⽂信息,⽐如:记录⼀个应⽤的共享信息
- 备注:限定SpringMVC中使⽤
6、websocket( HTTP WebSocket 作用域)
- 官⽅说明:Scopes a single bean definition to the lifecycle of a WebSocket. Only valid in the context of a web-aware Spring ApplicationContext.
- 描述:在⼀个HTTP WebSocket的⽣命周期中,定义⼀个Bean实例
- 场景:WebSocket的每次会话中,保存了⼀个Map结构的头信息,将⽤来包裹客户端消息头。第⼀次初始化后,直到WebSocket结束都是同⼀个Bean。
- 备注:限定Spring WebSocket中使⽤
二、单例作⽤域VS 全局作⽤域
- singleton 是 Spring Core 的作⽤域;application 是 Spring Web 中的作⽤域;
- singleton 作⽤于 IoC 的容器,⽽ application 作⽤于 Servlet 容器。
三、设置作用域
singleton作用域是Spring中默认的作用域,
@Component
public class Users {@Scope(prototype)@Bean(name = "u")public User user() {User user = new User();user.setId(1);user.setName("Hi user"); return user;}
} 1. 直接设置值:@Scope("prototype")2. 使⽤枚举设置:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

相关文章:
Bean 的六种作用域
目录 一、作用域是什么? 1、singleton(单例作用域) 2、prototype(原型作用域) 3、request(请求作用域) 4、session(回话作用域) 5、application(全局作用域&a…...
go语言--锁
锁的基础,go的锁是构建在原子操作和信号锁之上的 原子锁 原子包实现协程的对同一个数据的操作,可以实现原子操作,只能用于简单变量的简单操作,可以把多个操作变成一个操作 sema锁 也叫信号量锁/信号锁 核心是一个uint32值&#…...
再见,CSDN
从我2018年1月31日加入CSDN,到现在已经5年多的时间了。在这5年里,陆陆续续在CSDN上发布了很多论文阅读笔记、教程、技术文章等等,记录了我从大四到研究生再到工作这段时间的学习和成长轨迹。 我一直有备份个人资料的习惯,尤其是耗…...
MySQL总复习
目录 登录 显示数据库 创建数据库 删除数据库 使用数据库 创建表 添加数据表数据 查询表 添加数据表多条数据 查询表中某数据 增insert 删delete 改update 查select where like 编辑 范围查找 order by 聚合函数 count max min sum avg g…...
桌面平台层安全随手记录
声明 本文是学习桌面云安全技术要求. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 桌面平台层安全 桌面接入安全 用户标识 一般要求 本项要求包括: a) 系统应为用户提供唯一的身份标识,同时将用户的身份标识与该用户的所…...
【Docker】 08-Dockerfile
什么是Dockerfile Dockerfile可以认为是Docker镜像的描述文件,是由一系列命令和参数构成的教程,主要作用是用来构建docker镜像的构建文件。 Dockerfile解析过程 Dockerfile的保留命令 保留字作用FROM当前镜像是基于哪个镜像的 第一个指令必须是FROMMA…...
【二等奖方案】大规模金融图数据中异常风险行为模式挖掘赛题「Aries」解题思路
第十届CCF大数据与计算智能大赛(2022 CCF BDCI)已圆满结束,大赛官方竞赛平台DataFountain(简称DF平台)正在陆续释出各赛题获奖队伍的方案思路,欢迎广大数据科学家交流讨论。 本方案为【大规模金融图数据中…...
Github 下载指定文件夹(git sparse-checkout)
比如要下载这里的 data_utils 步骤 1、新建空文件夹,并进入新建的空文件夹。 2、git init 初始化 3、git remote add origin 添加远程仓库 4、git config core.sparsecheckout true 允许稀疏检出 5、git sparse-checkout set 设置需要拉取的文件夹(可…...
蚂蚁集团SQLess 开源,与内部版有何区别?
当我们使用关系型数据库时,SQL 是联系起用户和数据库的一座桥梁。 SQL 是一种高度非过程化的语言,当我们在编写SQL 时,表达的是想要什么数据,而不是怎么获取数据。因此,我们往往更关心SQL 有没有满足业务逻辑ÿ…...
An Efficient Memory-Augmented Transformer for Knowledge-Intensive NLP Tasks
本文是LLM系列文章,针对《An Efficient Memory-Augmented Transformer for Knowledge 一种用于知识密集型NLP任务的高效内存增强转换器 摘要1 引言2 相关工作3 高效内存增强Transformer4 EMAT的训练流程5 实验6 分析7 结论局限性 摘要 获取外部知识对于许多自然语言…...
Java项目中jar war pom包的区别
1、pom:用在父级工程或聚合工程中,用来做jar包的版本控制,必须指明这个聚合工程的打包方式为pom。 <project ...> <modelVersion>4.0.0</modelVersion> <groupId>com.wong.tech</groupId> <artifactI…...
整理mongodb文档:分页
个人博客 整理mongodb文档:分页 个人博客,求关注,如果文章不够清晰,麻烦指出。 文章概叙 本文主要讲下在聚合以及crud的find方法中如何使用limit还有skip进行排序。 分页的情况很经常出现,这也是这篇博客诞生的理由。 数据准备…...
社区团购新玩法,生鲜蔬菜配货发货小程序商城
在当前的电商市场中,生鲜市场具有巨大的潜力和发展空间。为了满足消费者的需求,许多生鲜店正在寻找创新的方法来提高销售和客户满意度。其中,制作一个个性且功能强大的生鲜小程序商城是一个非常有效的策略。以下是在乔拓云平台上制作生鲜小程…...
shell bash中设置命令set
1 Preface/Foreword set命令用于shell脚本在执行命令时候,遇到异常的处理机制。 2 Usage 2.1 set -e 当执行命令过程中遇到异常,那么就退出脚本,不会往下执行其它命令。 #!/bin/bash #set -eroot GIT_TAG${CI_BUILD_TAG-NOTAG} GIT_REV…...
机器学习---预剪枝、后剪枝(REP、CCP、PEP、)
1. 为什么要进行剪枝 横轴表示在决策树创建过程中树的结点总数,纵轴表示决策树的预测精度。 实线显示的是决策树 在训练集上的精度,虚线显示的则是在⼀个独⽴的测试集上测量出来的精度。 随着树的增⻓,在 训练样集上的精度是单调上升的&…...
Python 爬虫—scrapy
scrapy用于从网站中提取所需数据的开源协作框架。以一种快速、简单但可扩展的方式。 该爬虫框架适合于那种静态页面, js 加载的话,如果你无法模拟它的 API 请求,可能就需要使用 selenium 这种使用无头浏览器的方式来完成你的需求了 入门 imp…...
ABB机器人20032转数计数器未更新故障报警处理方法
ABB机器人20032转数计数器未更新故障报警处理方法 ABB的机器人上面安装有电池,需要定期进行更换(正常一年换一次),如果长时间不更换,电量过低,就会出现转数计数器未更新的报警,各轴编码器的位置就会丢失,在更换新电池后,需要更新转数计数器。 具体步骤如下: 先用手动…...
C# 记事本应用程序
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System...
模型训练:优化人工智能和机器学习,完善DevOps工具的使用
作者:JFrog大中华区总经理董任远 据说法餐的秘诀在于黄油、黄油、更多的黄油。同样,对于DevOps而言,成功的三大秘诀是自动化、自动化、更高程度的自动化,而这一切归根结底都在于构建能够更快速地不断发布新版软件的流程。 尽管人…...
WorldCoin 运营数据,业务安全分析
WorldCoin 运营数据,业务安全分析 Worldcoin 的白皮书中声明,Worldcoin 旨在构建一个连接全球人类的新型数字经济系统,由 OpenAI 创始人 Sam Altman 于 2020 年发起。通过区块链技术在 Web3 世界中实现更加公平、开放和包容的经济体系&#…...
利用自定义Ref实现防抖
防抖(Debounce)是一种常见的前端优化技术,用于限制函数频繁触发。本文通过自定义 ref 可以将其封装为可复用的逻辑。 防抖原理 防抖的核心是延迟执行函数,若在延迟时间内再次触发,则重新计时。通常用于输入框搜索、窗…...
下一代神经机器翻译质量评估框架:COMET的革命性架构与智能评估范式
下一代神经机器翻译质量评估框架:COMET的革命性架构与智能评估范式 【免费下载链接】COMET A Neural Framework for MT Evaluation 项目地址: https://gitcode.com/gh_mirrors/com/COMET COMET(A Neural Framework for MT Evaluation)…...
open-source-jobs未来发展规划:开源工作平台的愿景与路线图
open-source-jobs未来发展规划:开源工作平台的愿景与路线图 【免费下载链接】open-source-jobs A list of Open Source projects offering jobs. 项目地址: https://gitcode.com/gh_mirrors/op/open-source-jobs open-source-jobs 是一个专注于连接开源项目与…...
微软VibeVoice-TTS真实案例:用AI生成多人访谈节目音频
微软VibeVoice-TTS真实案例:用AI生成多人访谈节目音频 1. 从零开始认识VibeVoice-TTS 你是否曾经想过,用AI来制作一档完整的访谈节目?不是简单的单人口播,而是包含主持人、嘉宾互动、自然对话转折的专业级音频内容。微软开源的V…...
避开PLC烧毁陷阱:FX3S晶体管输出必须知道的7个细节(含虚设电阻计算)
避开PLC烧毁陷阱:FX3S晶体管输出必须知道的7个细节(含虚设电阻计算) 在工业自动化现场,FX3S系列PLC的晶体管输出模块烧毁问题堪称"隐形杀手"。去年某汽车生产线因一个0.5A保险丝选型错误导致全线停产8小时,损…...
零信任实践:OpenClaw+SecGPT-14B构建个人安全决策引擎
零信任实践:OpenClawSecGPT-14B构建个人安全决策引擎 1. 为什么需要个人安全决策引擎 去年某个深夜,我的服务器突然收到大量异常登录尝试。虽然最终没有造成损失,但这件事让我意识到:传统的静态密码和固定权限规则,在…...
WinSCP+VS Code远程开发:5个提升效率的隐藏技巧(附SSH配置避坑指南)
WinSCPVS Code远程开发:5个提升效率的隐藏技巧(附SSH配置避坑指南) 远程开发已成为现代开发者的标配工作流,而WinSCP与VS Code的组合堪称效率黄金搭档。但大多数开发者仅停留在基础文件传输和远程编辑层面,未能充分挖掘…...
烟台GEO搜索优化服务商链接烟台GEO搜索优化服务商
在当今数字化时代,越来越多的商家开始重视线上推广,希望通过互联网吸引更多潜在客户。然而,在实际操作中,很多商家面临着传统广告投放广撒网、预算浪费在非目标人群等问题。如何解决这些痛点,实现高效精准的营销呢&…...
SCH1633-D01 | 汽车6DoF传感器 |无人机惯性装置
SCH1633-D01 村田Murata 6DoF陀螺仪加速度传感器一体型 汽车用SCH1600传感器系列通过冗余设计选项和内置可调双输出通道为资深客户提供更大的灵活性。300/s的角速率测量范围8g的加速度测量范围冗余数字加速度计通道,动态范围高至26g陀螺仪零偏不稳定性低至0.5/h&am…...
OpenClaw电商运营助手:Qwen2.5-VL-7B批量生成商品图文详情
OpenClaw电商运营助手:Qwen2.5-VL-7B批量生成商品图文详情 1. 为什么需要自动化商品详情生成 每次大促前,运营团队最头疼的就是商品详情页的批量更新。去年双十一前,我手动处理了200多个SKU的图文优化,连续加班一周后࿰…...
