探究Spring Bean的六种作用域:了解适用场景和使用方式

news2024/7/6 10:36:54

这里写目录标题

    • 单例(Singleton)作用域:
    • 原型(Prototype)作用域:
    • 请求(Request)作用域:
    • 会话(Session)作用域:
    • 全局(application)作用域:
    • HTTP WebSocket 作⽤域

主要对单例作用域与原型作用域进行重点说明,其余四个了解即可

单例(Singleton)作用域:

单例作用域一般是默认的Bean作用域。Spring容器在第一次获取Bean时创建实例,并在后续请求中返回同一个实例。

例如:
我们现在创建一个公共的Bean供用户一与用户二使用,用户一再使用完后对其内容进行修改,后被用户二使用,查看Bean是否改变,即可查看Bean的作用域。

公共的Bean:

@Component
public class Users {
   private User user;
    @Bean
    public User user1(){
       user= new User(1);
       user.setName("zcx");
       return user;
    }
}

用户一使用时进行修改操作:

@Controller
public class BeanScopesController {
    @Autowired
    private User user;
    public  User getUser(){
        User user1 = user;
        System.out.println(user1.toString()+"这是修改之前的");
        user1.setName("java");
        return  user1;
    }
}

用户二再去使用Bean:

@Controller
public class BeanScopesController2 {
    @Autowired
    private User user2;
    public  User getUser2(){
        User user = user2;
        return user;
    }
}

打印用户一与用户二共用Bean的值:

public class demo {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
            BeanScopesController beanScopesController = context.getBean(BeanScopesController.class);
        System.out.println(beanScopesController.getUser().toString()+"这是第一个调用对象修改之后的");
        BeanScopesController2 beanScopesController2 = context.getBean(BeanScopesController2.class);
        System.out.println(beanScopesController2.getUser2().toString()+"这是第二个对象调用之后的");

    }
}

进行结果打印:
在这里插入图片描述
通过结果我们发现用户一修改过的值在用户二中也出现了,已经不是初始的值了。
所以说明Bean 默认情况下是单例状态(singleton),也就是所有用户的使⽤的都是同⼀个对象。

原型(Prototype)作用域:

每次对该作⽤域下的Bean的请求都会创建新的实例:获取Bean(即通过applicationContext.getBean等⽅法获取)及装配Bean(即通过@Autowired注⼊)都是新的对象实例

可以使⽤ @Scope 标签⽤来修改Bean 的作⽤域,例如:

@Component
public class Users {
   private User user;
   @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    @Bean
    public User user1(){
       user= new User(1);
       user.setName("zcx");
       return user;
    }
}

通过跟前面一样的代码打印结果如下:
在这里插入图片描述
通过结果我们知道Bean的作用域已经由单例模式修改为原型模式也就是多例模式
当然@Scope 标签有两种设置⽅式:

  1. 直接设置值:@Scope(“prototype”)
  2. 使⽤枚举设置:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

请求(Request)作用域:

每次http请求会创建新的Bean实例,类似于prototype,⼀次http的请求和响应的共享Bean,限定SpringMVC中使⽤

会话(Session)作用域:

在⼀个http session中,定义⼀个Bean实例,⽤户回话的共享Bean,限定SpringMVC中使⽤

全局(application)作用域:

在⼀个http servlet Context中,定义⼀个Bean实例,使用于Web应⽤的上下⽂信息,限定SpringMVC中使⽤

HTTP WebSocket 作⽤域

在⼀个HTTP WebSocket的⽣命周期中,定义⼀个Bean实例,WebSocket的每次会话中,保存了⼀个Map结构的头信息,将⽤来包裹客户端消息头。第⼀次初始化后,直到WebSocket结束都是同⼀个Bean,限定Spring WebSocket中使⽤

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

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

相关文章

【一文搞懂】—带霍尔编码器的直流有刷减速电机

文章目录 一、直流有刷电机二、减速比三、霍尔编码器3.1 霍尔编码器3.2 霍尔编码器测速原理 四、测速程序设计4.1 跳变沿检测4.2 计算转速 一、直流有刷电机 宏观上说直流有刷电机由固定部分(定子)和旋转部分(转子)组成。在定子上…

Web Worker的概念、用法、使用场景

​ 目录 1. 简介 2. 适用场景 2.1 复杂计算 2.2 后台下载 2.3 数据处理 2.4 实时通信 3. 代码示例 3.1 Worker特性检测 3.2 Worker API 3.3 SharedWorker API 3.4 创建 JavaScript 文件 3.5 创建 Web Worker 4. 总结 1. 简介 Web Worker 使得在一个独立于 Web 应…

2023-07-27 LeetCode每日一题(删除每行中的最大值)

2023-07-27每日一题 一、题目编号 2500. 删除每行中的最大值二、题目链接 点击跳转到题目位置 三、题目描述 给你一个 m x n 大小的矩阵 grid ,由若干正整数组成。 执行下述操作,直到 grid 变为空矩阵: 从每一行删除值最大的元素。如果…

VS2022和QT混合编程打包发布程序

1.在开始菜单输入 CMD 找到 Qt5.15.2(MSVC 64-bit) 2.输入windeployqt exe所在路径 3.运行完毕后,双击打开exe文件,可能会报错,缺少相关的dll,找到缺少的dll拷贝到运行文件夹下即可。

数字化管理能给企业带来哪些好处?

企业数字化管理(EDM)是指使用数字技术和工具来管理企业运营和流程的各个方面。如果有效实施,EDM 可以给企业带来多种好处,提高企业的整体效率、生产力和竞争力。以下是一些主要优点: 1.提高效率:EDM 通过自…

参数自定义配置比例阀放大器

模拟指令输入比例阀放大器通常使用模拟信号来控制其输出,例如10V, 0~5V,0~10V,4~20mA模拟量信号。它可以将输入的模拟信号放大并转换为一个与输入信号成正比的输出信号,从而实现对执行机构的位置或速度控制。 适配各种不带位置反馈比例阀的控制&#xf…

Python 并发编程 Futures

文章目录 说明1. 并发与并行2. Futures 模块2.1 顺序执行2.2 并发执行2.3 并行执行2.4 Executor 对象 3. 全局解释器锁3.1 为什么有 GIL3.2 GIL 工作过程3.3 线程安全 后记 说明 编程中如果能合理利用编程语言的并发编程技巧,都可以极大提升程序的性能。在 Python …

手把手教你激活虹科物联网HMI/网关数据库功能

前言 JMobile Studio 4.5的更新使得虹科物联网HMI/网关可以本地支持MySQL、PostgreSQL以及支持ODBC驱动连接的数据库,实现设备数据的存储,方便企业数据的统筹管理。 因此,本文主要介绍如何激活虹科物联网HMI/网关的数据库功能。 操作步骤 …

淘宝订单截图生成器网页版制作

你是否曾经为手动制作淘宝订单截图而烦恼?现在,有了淘宝订单生成器,这一切都变得轻松起来。 作为一款专为淘宝购物爱好者打造的神器,淘宝订单生成器可以轻松帮你生成美观的订单截图,让你的朋友们羡慕不已。不再需要手…

临床数据 4. 肿瘤克隆进化分析结果解读?

临床数据分析方案 桓峰基因公众号推出临床数据分析方案,整理如下: 临床数据 1. 临床基因突变数据如何发高分? 临床数据 2. 基于NGS的胃癌诊疗全过程的临床应用方案 临床数据 3. 肿瘤微小残留病灶(MRD)如何发文章? 克隆进化生信分析…

【雕爷学编程】Arduino动手做(93)--- 0.96寸OLED液晶屏模块11

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

UI设计工具都有哪些好用的推荐?

对于UI设计的初学者来说,掌握一个实用且易于使用的界面UI软件是非常重要的。今天,我整理了四个易于使用的界面UI软件。让我们看看。 即时设计 即时设计是一款免费的在线 UI 设计工具,无系统限制,浏览器打开即可使用,…

gin框架内容(二)

上一篇过于gin的内容 https://mp.csdn.net/mp_blog/creation/editor/131953861 CSDNhttps://mp.csdn.net/mp_blog/creation/editor/131953861 一、路由组 为了管理具有相同前缀的URL, 将拥有URL共同前缀的路由划分为一组 为了代码的阅读性,使用{}包裹相同组的路由…

SDN系统方法 | 7. 叶棘网络

随着互联网和数据中心流量的爆炸式增长,SDN已经逐步取代静态路由交换设备成为构建网络的主流方式,本系列是免费电子书《Software-Defined Networks: A Systems Approach》的中文版,完整介绍了SDN的概念、原理、架构和实现方式。原文: Softwar…

【WIN系统】创建任务计划程序:因为空格问题而无法创建的解决办法

在计算机管理中创建任务计划程序如下图: 【问题】 1. 点击“创建任务”或“创建基本任务” 2. 在操作一栏中,我们可以发现,之前已经存在的任务中,“程序或脚本”不带引号,而且允许存在空格。但自己输入时,…

Cesium 实战 - Blender调整模型组件原点,实现直升机尾翼旋转

Cesium 实战 - Blender调整模型组件原点,实现直升机尾翼旋转 1.模型原点问题2.导入模型(zhisheng.glb)3.导出模型4. 通过 czml 调试代码 某个项目需求,在操作直升机模型的时候,希望直升机机翼和尾翼旋转起来。 机翼旋…

多项目进度把控:选择合适的项目管理系统助力无忧

我相信很多企业都在使用项目管理系统,但你有没有想过为什么要使用这些工具?想象一下,如果我们使用传统的而不是这些项目管理系统,excel或work一些简单的在线文档记录能满足我们的需求吗?当需求发生变化时,这…

前端学习——Vue (Day5)

自定义指令 <template><div><h1>自定义指令</h1><input v-focus ref"inp" type"text" /></div> </template><script> export default {// mounted(){// this.$ref.inp.focus()// }// 2. 局部注册指令di…

桥梁安全监测系统中数据采集上传用 什么?

背景 2023年7月6日凌晨时分&#xff0c;G5012恩广高速达万段230公里加80米处6号大桥部分桥面发生垮塌&#xff0c;导致造成2车受损后自燃&#xff0c;3人受轻伤。目前&#xff0c;四川省公安厅交通警察总队高速公路五支队十四大队民警已对现场进行双向管制。 作为世界第一桥梁…

亚马逊云科技纽约峰会官宣生成式AI产品策略升级

作为云计算领域的领导者和创新者&#xff0c;生成式AI&#xff08;Generative AI&#xff09;一直是亚马逊云科技持续关注和投入的主要方向。在今年4月&#xff0c;亚马逊云科技发布了以Amazon Bedrock为代表的生成式AI产品全家桶&#xff0c;正式入局该赛道并宣布了亚马逊云科…