Spring Bean作用域

news/2024/4/24 6:56:43/文章来源:https://blog.csdn.net/m0_61210742/article/details/128429159

目录

什么是作用域呢 ?

那什么又是Spring Bean的作用域呢 ?

Spring框架默认Bean作用域是什么呢 ?

Spring Bean的作用域都有哪些呢 ?

如何设置Bean作用域


什么是作用域呢 ?

在JavaSE中,作用域就是指一个变量可生效的范围. 就比如一个变量的作用域是方法的代码块的范围,只在方法内部生效.

那什么又是Spring Bean的作用域呢 ?

我来给一下官方的定义: Spring Bean的作用域是指Bean在整个框架中的某种行为模式.

看着这官方定义是有点懵 啥叫行为模式.

那就在举一个例子 : Singleton是单例作用域,那就是指对于一个Bean,它在整个Spring框架中只存在一份,是全局的共享的,如果要操作这个Bean,所有人都操作这一份Bean.

也就是当一个人将这个Bean被修改了,其他人读取到的就是被修改之后的值.

Spring框架默认Bean作用域是什么呢 ?

我们来实战演练一把,通过这个示例就可以知道Spring默认Bean 作用域是什么了.

有一个Bean为commonBean,假设张三来写一个类来初始化这个Bean然后将Bean存储到Spring中,李四去新创建一个对象来引用这个公共Bean(commonBean),然后使用并修改,王五要使用这个公共的Bean.

commonBean

public class CommonBean {//创建一个公共的对象供给两个人去使用private String name;private int age;private int id;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public int getId() {return id;}public void setId(int id) {this.id = id;}@Overridepublic String toString() {return "CommonBean{" +"name='" + name + '\'' +", age=" + age +", id=" + id +'}';}
}

张三来写一个类来初始化这个Bean然后将Bean存储到Spring中

@Controller
public class CommonScope {//公共的类->供给其他人使用//使用Bean注解将公共类返回的公共Bean存到Spring中@Beanpublic CommonBean doCommonBean(){CommonBean commonBean = new CommonBean();commonBean.setName("Java");commonBean.setAge(19);commonBean.setId(2000);return commonBean;}
}

李四去新创建一个对象来引用这个公共Bean(commonBean),然后使用并修改

@Controller
public class ScopeController1 {@Autowiredprivate CommonBean commonBean;public void doScopeController1() {//李四自己创建一个对象引用公共的BeanCommonBean commonBean1 = commonBean;System.out.println("修改前的数据" + commonBean);commonBean1.setName("C++");System.out.println("修改后的数据" + commonBean1);}
}

王五要使用这个公共的Bean.

@Controller
public class ScopeController2 {@Autowiredprivate CommonBean commonBean;public void doScopeController2(){System.out.println("使用公共的Bean信息为 : " + commonBean);}
}

启动类进行使用

public class App {//启动类public static void main(String[] args) {//获取到SpringContext上下文对象ApplicationContext context1 = new ClassPathXmlApplicationContext("spring-config.xml");System.out.println("=================================");ScopeController1 scopeController1 = context1.getBean("scopeController1", ScopeController1.class);scopeController1.doScopeController1();System.out.println("=================================");ScopeController2 scopeController2 = context1.getBean("scopeController2", ScopeController2.class);scopeController2.doScopeController2();}
}

这个时候就会有情况发生我们接下来看运行结果

所以从这里就可以知道Spring框架默认Bean的作用域就是单例作用域.

Spring Bean的作用域都有哪些呢 ?

Spring一共有6种作用域.Spring在为Bean初始化的时候就会设置作用域.

分别为下面6种作用域

  • 单例作用域(singleton)

单例作用域是Spring默认的作用域.

单例作用域下 : Bean在SpringIOC容器只存在一个实例,也就是获取Bean(context.getBean())和注入/装配Bean(比如AutoWired注入3)操作Bean的都是同一个Bean

适用场景 : 单例作用域一般适用于无状态的Bean(Bean的状态不需要更新).

  • 多例作用域(prototype)

多例作用域也叫原型作用域

对于一个Bean,每次访问这个Bean都会创建新的实例.

也就是在Spring中获取Bean(context.getBean())或者注入Bean(AutoWired注入Bean)操作的这个Bean都是新创建的Bean

适用场景 : 多例作用域一般适用于有状态的Bean(Bean的状态需要更新).

  • 请求作用域(request)

在请求作用域下,每次HTTP请求都会创建新的Bean实例.

这个与prototype类似 但是不相同 prototype是每次访问Bean就创建,而request是每次HTTP请求创建新的实例(每次HTTP请求也可能访问多个Bean)

适用场景 : 请求作用域在Spring MVC场景下才能够生效 适用于一次HTTP请求共享Bean

  • 会话作用域(session)

在会话作用域下,每次session会话都会创建一个新的实例

适用场景 : 请求作用域在Spring MVC场景下才能够生效,适用于在一次会话共享Bean

  • 全局作用域(Application)

在一个Http Servlet Context 中创建一个实例

适用场景 : 请求作用域在Spring MVC场景下才能够生效,适用于Web应用的上下文信息

  • WebSocket(了解即可)

在一个HTTP WebSocket的生命周期中,创建新的实例

适用场景 : 请求作用域在Spring MVC场景下才能够生效,WebSocket的每次会话中,保存了⼀个Map结构的头信息,将⽤来包裹客户端消息头。第⼀次初始化后,直到WebSocket结束都是同⼀个Bean

在Bean初始化的时候,就会为Bean设置其作用域.

Spring共有6种作用域

其中单例作用域和多例作用域在Spring框架中使用

请求作用域,会话作用域,全局作用域,WebSocket 只有在SpringMVC框架中才会生效.

如何设置Bean作用域

有两种方式设置Bean的作用域

第一种是直接设置值

比如我们来设置多例作用域

第二种是通过枚举的方式

比如我们来设置多例作用域

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

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

相关文章

将单向链表按照目标值value 划分成左边小,中间等,右边大的形式,给定一个单链表,判断单链表的值是否是回文结构【图文解释包你看懂】

将单向链表按照目标值value 划分成左边小,中间等,右边大的形式 例如 1 -> 3 -> 5-> 3 -> 7 按照value 3划分 1-> 3-> 3 -> 5 -> 7 解题思路:给定值为 value 用6个变量,分别表示 小于value 的Head sH &…

第11章_数据库的设计规范(理论了解)

第11章_数据库的设计规范 范式 2.3键和相关属性的概念 范式的定义会使用到主键和候选键,数据库中的键(Key)由一个或者多个属性组成。数据表中常用的几种键和属性的定义: 超键︰能唯─标识元组的属性集叫做超键。候选键︰如果超键不包括多余的属性,那…

WEB1.0起源:全球首个网站info.cern.ch

伯纳斯李(图)1990年创立第一个网站。 info.cern.ch是世上第一个网站,提供有关万维网的资料。 info.cern.ch这个网站依然运作如常。 英国科学家蒂姆伯纳斯-李 (Tim Berners-Lee) 于 1989 年在 CERN 工作期间发明了万维网 (WWW)。Web 最初的构思…

mqtt的使用与二次封装

前提:先安装Mosquitto并启动服务,可使用mqttx进行接收发送的测试。 Mosquitto以配置启动命令 mosquitto -c mosquitto.conf -v原文链接:mqtt的使用 本文为测试使用固无账号密码,可在原文查看 封装后实现效果,加入一个…

耗时二周,万字总结Maven简明教程,与君共勉!

什么是Mavne Maven 是一个项目管理工具,它包含了一个项目对象模型 (POM:Project Object Model),一组标准集合。由于 Maven 使用标准目录布局和默认构建生命周期,开发团队几乎可以立即自动化项目的构建基础设施。在多个开发团队环…

消息队列RabbitMQ学习笔记(四)死信队列和延迟队列

1. 死信的概念 先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的消息,字面意思可以这样理 解,一般来说,producer 将消息投递到 broker 或者直接到queue 里了,consumer 从 queue 取出消息 进行…

Linux 下 使用点阵在LCD上显示汉字,字符

文章目录前言一、显示字符1.获取点阵:2.描点(显示字符函数):3. 要打开LCD设备:4. 通过ioctl 获取Framebuffer参数:5. 通过mmap映射出Framebuffer的地址:6.清屏并显示字符:二、显示汉字1.区位码&…

多线程基础入门

文章目录前言一、认识线程(一)概念1.线程是什么2.为啥要有线程(轻量级进程)为什么线程比进程更轻量经典面试题:谈谈进程和线程的区别和联系3.线程的结构(二)第一个多线程程序(三&…

我国用电信息采集系统行业应用需求及市场容量分析 现6省上线运行

用户用电信息采集系统是通过对配电变压器和终端用户的用电数据的采集和分析,实现用电监控、推行阶梯定价、负荷管理、线损分析,最终达到自动抄表、错峰用电、用电检查(防窃电)、负荷预测和节约用电成本等目的。建立全面的用户用电…

RabbitMQ 第一天 基础 4 RabbitMQ 的工作模式 4.4 Topic 通配符模式 4.5 工作模式总结

RabbitMQ 【黑马程序员RabbitMQ全套教程,rabbitmq消息中间件到实战】 文章目录RabbitMQ第一天 基础4 RabbitMQ 的工作模式4.4 Topic 通配符模式4.4.1 模式说明4.4.2 代码编写4.4.3 小结4.5 工作模式总结第一天 基础 4 RabbitMQ 的工作模式 4.4 Topic 通配符模式 …

32天高效突击:开源框架+性能优化+微服务架构+分布式,面阿里获P7(脑图、笔记、面试考点全都有)

今年的大环境不佳,所以大部分的人在今年的招聘旺季都没有收获到好的结果。 但不要着急,今天分享的内容则是由 一位阿里P7的面试心得,通过32天的高效突击训练,成功拿下offer的学习方法。 篇章分为三大章节,可以根据自…

day 10 模拟和高精度

P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布 #include<bits/stdc.h> using namespace std; int n, na, nb, fa, fb;//f:得分 int a[205], b[205];void fun(int ta, int tb){if(ta 0 && tb 1) fb;if(ta 1 && tb 0) fa;if(ta 0 && tb …

【nowcoder】笔试强训Day2

目录 一、选择题 二、编程题 2.1排序子序列 2.2倒置字符串 一、选择题 1.A 派生出子类 B &#xff0c; B 派生出子类 C &#xff0c;并且在 java 源代码有如下声明&#xff1a; 1. A a0new A(); 2. A a1new B(); 3. A a2new C(); 问以下哪个说法是正确的&#xff08;&…

机器学习 | 线性回归

一.基本原理 利用回归方程&#xff08;函数&#xff09;对一个或多个自变量&#xff08;特征值&#xff09;和因变量&#xff08;目标值&#xff09;之间关系进行建模的一种分析方式 根据线性代数&#xff0c;我们可以定义方程 xwy&#xff0c;在线性回归问题中&#xff0c;x…

前端小知识:赋予变量默认值(逻辑与运算符、空值合并运算符、逻辑空运算符)

8. 逻辑与运算符、空值合并运算符、逻辑空运算符&#xff08;可用赋予默认值&#xff09; &#xff08;空值合并运算符&#xff09;官方文档&#xff1a; https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing   &#xff08;逻辑…

【推荐收藏】这份图解算法数据结构的材料太良心

5年前发生的一件事&#xff0c;成为了我职业生涯的重要转折点。当时的我在交大读研&#xff0c;对互联网求职一无所知&#xff0c;但仍然硬着头皮申请了 Microsoft 实习生。面试官让我在白板上写出“快速排序”代码&#xff0c;我畏畏缩缩地写了一个“冒泡排序”&#xff0c;并…

1754. 构造字典序最大的合并字符串

摘要 1754. 构造字典序最大的合并字符串 一 贪心算法分析 题目要求合并两个字符串 word1 与 word2&#xff0c;且要求合并后的字符串字典序最大。首先需要观察一下合并的选择规律&#xff0c;假设当前需要从 word1​ 的第 i 个字符和 word2​ 的第 j个字符选择一个字符加入到…

自制macOS安装镜像iso虚拟机用

在网上下载的用于在虚拟机中安装的镜像版本相对比较旧。安装完成后还要进行升级比较麻烦。于是我就想自己制作安装镜像了。 精华 #创建空白磁盘镜像 hdiutil create -o /tmp/ventura -size 13800m -volname ventura -layout SPUD -fs HFSJ #挂载上面创建的镜像 hdiutil attac…

内容资产管理11问

&#x1f447;点击一键关注主笔&#xff1a;邹小困、邝晴岚主持人&#xff1a;增长黑盒分析师Emma出品&#xff1a;增长黑盒研究组前言在这个信息爆炸的数据时代&#xff0c;各个行业正积极推进数字化转型&#xff0c;产业升级与技术赋能成为主题之一。在推进企业线上线下融合的…

最近面试遇到一个算法题,简单写一点。

第⼀题&#xff08;必答&#xff09; 请针对有重复数字的数组设计⼀个快排算法&#xff0c;⽐如&#xff1a;[34, 34, 89, 1, 1, 20, 12]&#xff0c;排序后结果为 [89,34,34,20,12,1,1] 第⼆题&#xff08;必答&#xff09; 请利⽤Redis 实现⼀个通⽤分布式锁&#xff0c;并…