解释Spring支持的几种bean的作用域

Spring 框架支持多种 Bean 的作用域(Scope),通过作用域可以控制 Bean 的生命周期和可见性。了解不同作用域的用途,可以帮助开发者更好地管理 Bean 的创建和销毁,从而提高资源利用效率并确保应用程序的性能。以下是 Spring 支持的几种常见 Bean 作用域:

1. 单例作用域(Singleton)

定义:在 Spring 容器中,每个定义的 Bean 只有一个实例,默认作用域。

特点

  • 在整个 Spring 容器生命周期内,Bean 只有一个实例。
  • 所有对该 Bean 的请求都返回同一个实例。

使用场景

  • 适用于线程安全的无状态服务或共享资源。

示例

 

java复制代码

@Component @Scope("singleton") public class SingletonBean { // 单例 Bean }

2. 原型作用域(Prototype)

定义:每次请求 Bean 时,都会创建一个新的实例。

特点

  • 每次请求都会返回一个新的 Bean 实例。
  • Spring 只负责初始化 Bean,不负责销毁 Bean。

使用场景

  • 适用于有状态、线程不安全的组件。

示例

 

java复制代码

@Component @Scope("prototype") public class PrototypeBean { // 原型 Bean }

3. 请求作用域(Request)

定义:每次 HTTP 请求都会创建一个新的 Bean 实例。

特点

  • 每次 HTTP 请求都会创建一个新的 Bean 实例,并在请求结束时销毁该实例。
  • 仅适用于 Web 应用程序。

使用场景

  • 适用于需要在每次 HTTP 请求期间保持状态的 Bean。

示例

 

java复制代码

@Component @Scope("request") public class RequestScopedBean { // 请求作用域 Bean }

4. 会话作用域(Session)

定义:在 HTTP 会话期间,每个会话创建一个新的 Bean 实例。

特点

  • 每个 HTTP 会话创建一个新的 Bean 实例,并在会话过期或无效时销毁该实例。
  • 仅适用于 Web 应用程序。

使用场景

  • 适用于需要在 HTTP 会话期间保持状态的 Bean。

示例

 

java复制代码

@Component @Scope("session") public class SessionScopedBean { // 会话作用域 Bean }

5. 全局会话作用域(Global Session)

定义:在全局 HTTP 会话期间,每个全局会话创建一个新的 Bean 实例。

特点

  • 主要用于基于 Portlet 的 Web 应用程序,每个 Portlet 全局会话会创建一个新的 Bean 实例。
  • 在标准的 Web 应用程序中很少使用。

使用场景

  • 适用于需要在全局 HTTP 会话期间保持状态的 Bean。

示例

 

java复制代码

@Component @Scope("globalSession") public class GlobalSessionScopedBean { // 全局会话作用域 Bean }

6. 应用程序作用域(Application)

定义:在 ServletContext 生命周期内,每个 ServletContext 创建一个新的 Bean 实例。

特点

  • 在整个 ServletContext 期间,Bean 只有一个实例。
  • 适用于 Web 应用程序。

使用场景

  • 适用于需要在整个 Web 应用程序生命周期内共享状态的 Bean。

示例

 

java复制代码

@Component @Scope("application") public class ApplicationScopedBean { // 应用程序作用域 Bean }

自定义作用域

Spring 还支持自定义作用域。通过实现 org.springframework.beans.factory.config.Scope 接口,可以定义自定义作用域。

示例

 

java复制代码

public class CustomScope implements Scope { private Map<String, Object> scopedObjects = new HashMap<>(); private Map<String, Runnable> destructionCallbacks = new HashMap<>(); public Object get(String name, ObjectFactory<?> objectFactory) { return scopedObjects.computeIfAbsent(name, k -> objectFactory.getObject()); } public Object remove(String name) { destructionCallbacks.remove(name); return scopedObjects.remove(name); } public void registerDestructionCallback(String name, Runnable callback) { destructionCallbacks.put(name, callback); } public Object resolveContextualObject(String key) { return null; } public String getConversationId() { return "custom"; } }

注册自定义作用域:

 

java复制代码

@Configuration public class AppConfig { @Bean public CustomScope customScope() { return new CustomScope(); } @Bean public static CustomScopeConfigurer customScopeConfigurer(CustomScope customScope) { CustomScopeConfigurer configurer = new CustomScopeConfigurer(); configurer.addScope("custom", customScope); return configurer; } }

使用自定义作用域:

 

java复制代码

@Component @Scope("custom") public class CustomScopedBean { // 自定义作用域 Bean }

总结

Spring 支持多种 Bean 作用域,可以根据不同应用场景选择合适的作用域:

  1. 单例作用域(Singleton):默认作用域,全局共享单一实例。
  2. 原型作用域(Prototype):每次请求创建一个新实例。
  3. 请求作用域(Request):每次 HTTP 请求创建一个新实例。
  4. 会话作用域(Session):每个 HTTP 会话创建一个新实例。
  5. 全局会话作用域(Global Session):每个 Portlet 全局会话创建一个新实例。
  6. 应用程序作用域(Application):在整个 ServletContext 生命周期内共享单一实例。

理解和合理选择 Bean 的作用域,可以帮助开发者在不同的业务场景中更好地管理 Bean 的生命周期,提高应用程序的性能和资源利用效率。

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

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

相关文章

window用户层文件系统fuse(wdm驱动)

dokany https://github.com/dokan-dev/dokany.git 需要安装wdk&#xff0c;2022可以直接通过windows driver扩展安装 项目使用nuget添加wdk依赖 Version of Uwp Package 10.0.26100.0 does not match TargetPlatformVersion 10.0.22621.0. windows sdk版本填写正确的版本号…

算法实验2.2、2.3

2.2主要内容 比较快速排序&#xff0c;归并排序以及堆排序算法的时间效率。了解影响算法执行时间的 主要因素以及如何降低算法的执行时间。 #include<iostream> using namespace std; #include<stdio.h> #include<malloc.h> #include<stdlib.h> #inc…

【论文阅读】-- 研究时间序列可视化,提升用户体验

Investigating Time Series Visualisations to Improve the User Experience 摘要1 引言2 相关工作互动技巧视觉编码坐标系 3 用户研究时间序列可视化互动技巧任务实验设计 4 结果交互技术的效果视觉编码的影响坐标系的影响 5 讨论交互技术的效果视觉编码的影响坐标系的影响 6 …

芒果YOLOv10改进122:注意力机制系列:最新结合即插即用CA(Coordinate attention) 注意力机制,CVPR 顶会助力分类检测涨点!

论文所提的Coordinate注意力很简单,可以灵活地插入到经典的移动网络中,而且几乎没有计算开销。大量实验表明,Coordinate注意力不仅有益于ImageNet分类,而且更有趣的是,它在下游任务(如目标检测和语义分割)中表现也很好。本文结合目标检测任务应用 应专栏读者的要求,写一…

cube-studio开源一站式机器学习平台,在线ide,jupyter,vscode,matlab,rstudio,ssh远程连接,tensorboard

全栈工程师开发手册 &#xff08;作者&#xff1a;栾鹏&#xff09; 一站式云原生机器学习平台 前言 开源地址&#xff1a;https://github.com/tencentmusic/cube-studio cube studio 腾讯开源的国内最热门的一站式机器学习mlops/大模型训练平台&#xff0c;支持多租户&…

7-494 结构体数组实现工资数据的存放与输出(结构体)

用结构体存放下表中的数据&#xff0c;然后输出每人的姓名和实发工资&#xff08;基本工资浮动工资-支出&#xff09; 输入格式: 在每一行输入姓名&#xff0c;基本工资&#xff0c;浮动工资及支出 输出格式: 每一行输出姓名及实发工资 输入样例: 在这里给出一组输入。例…

【Linux】:环境变量

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux环境变量的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门…

mac|浏览器链接不上服务器但可以登微信

千万千万千万不要没有关梯子直接关机&#xff0c;不然就会这样子呜呜呜 设置-网络&#xff0c;点击三个点--选择--位置--编辑位置&#xff08;默认是自动&#xff09; 新增一个&#xff0c;然后选中点击完成 这样就可以正常上网了

【嵌入式DIY实例】- LCD ST7735显示DHT11传感器数据

LCD ST7735显示DHT11传感器数据 文章目录 LCD ST7735显示DHT11传感器数据1、硬件准备与接线2、代码实现本文介绍如何将 ESP8266 NodeMCU 板 (ESP-12E) 与 DHT11 (RHT01) 数字湿度和温度传感器连接。 NodeMCU 从 DHT11 传感器读取温度(以 C 为单位)和湿度(以 rH% 为单位)值,…

计算机网络-第5章运输层

5.1运输层协议概述 5.1.1进程之间的通信 运输层向它上面的应用层提供通信服务&#xff0c;它属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最低层。 通信的两端应当是两个主机中的应用进程。 运输层复用和分用&#xff1a;复用指在发送方不同的应用进程都可以…

vCenter VXR01405C ALARM Certificate is about to expire

vCenter VXR01405C ALARM Certificate is about to expire 需要更新证书 步骤如下 ===vCenter=== root@vc [ ~ ]# for i in $(/usr/lib/vmware-vmafd/bin/vecs-cli store list); do echo STORE $i; sudo /usr/lib/vmware-vmafd/b STORE MACHINE_SSL_CERT Alias : __MACHINE…

【机器学习】FFmpeg+Whisper:二阶段法视频理解(video-to-text)大模型实战

目录 一、引言 二、FFmpeg工具介绍 2.1 什么是FFmpeg 2.2 FFmpeg核心原理 2.3 FFmpeg使用示例 三、FFmpegWhisper二阶段法视频理解实战 3.1 FFmpeg安装 3.2 Whisper模型下载 3.3 FFmpeg抽取视频的音频 3.3.1 方案一&#xff1a;命令行方式使用ffmpeg 3.3.2 方案二&a…

代码随想录第四十四天 | 1049.最后一块石头的重量II,494.目标和,474.一和零

1049.最后一块石头的重量II 看完想法&#xff1a;和分割等和子集非常像&#xff0c;主要思想是把石头分成两份重量近似一样的&#xff0c;然后相减&#xff0c;得到的就会是可能的最小数值 int lastStoneWeightII(vector<int>& stones) {vector<int> dp(1500…

【高考志愿】力学

目录 一、专业概述 二、专业方向 三、就业前景 四、注意事项 五、学习挑战与收获 六、深造与进修 七、个人兴趣与职业规划 八、力学专业排名 九、总结与建议 高考志愿中选择力学专业是一个涉及广泛且基础扎实的学科选择。 一、专业概述 力学是物理学的一个重要分支&a…

基于协同过滤的电影推荐与大数据分析的可视化系统

基于协同过滤的电影推荐与大数据分析的可视化系统 在大数据时代&#xff0c;数据分析和可视化是从大量数据中提取有价值信息的关键步骤。本文将介绍如何使用Python进行数据爬取&#xff0c;Hive进行数据分析&#xff0c;ECharts进行数据可视化&#xff0c;以及基于协同过滤算法…

SuperMap GIS基础产品FAQ集锦(20240701)

一、SuperMap iDesktopX 问题1&#xff1a;对于数据提供方提供的osgb格式的数据&#xff0c;如何只让他生成一个s3mb文件呢&#xff1f;我用倾斜入库的方式会生成好多个s3mb缓存文件 11.1.1 【解决办法】不能控制入库后只生成一个s3mb文件&#xff1b;可以在倾斜入库的时候设…

2024第17届中国西部(重庆)留学移民海外置业展览会

2024第17届中国西部&#xff08;重庆&#xff09;留学移民海外置业展览会 邀请函 主办单位&#xff1a; 中国西部教体医融合博览会组委会 承办单位&#xff1a;重庆中博展览有限公司 展会背景&#xff1a; 成都和重庆是中国新一线城市&#xff0c;是西部经济的核心增长极&a…

代码随想录算法训练营第59天:动态[1]

代码随想录算法训练营第59天&#xff1a;动态 两个字符串的删除操作 力扣题目链接(opens new window) 给定两个单词 word1 和 word2&#xff0c;找到使得 word1 和 word2 相同所需的最小步数&#xff0c;每步可以删除任意一个字符串中的一个字符。 示例&#xff1a; 输入: …

实施粘贴式导航_滚动事件

● 所谓的粘贴式导航&#xff0c;就是当我们滑动页面到某一个位置的时候&#xff0c;导航不会因为滑动而消失&#xff0c;会固定在页面的顶部&#xff0c;我们来看一下如何实现&#xff1b; ● 首先我们要获取我们想要滚动到哪一部分的时候让导航栏显示出来&#xff0c;这就需要…

Java案例抢红包

目录 一&#xff1a;题目要求&#xff1a; 二&#xff1a;思路分析&#xff1a;&#xff08;遇见问题先想出完整的思路逻辑再去动手事半功倍&#xff09; 三&#xff1a;具体代码&#xff1a; 一&#xff1a;题目要求&#xff1a; 二&#xff1a;思路分析&#xff1a;&#x…