Bean 的六种作用域

 

目录

一、作用域是什么?

1、singleton(单例作用域)

2、prototype(原型作用域)

3、request(请求作用域)

4、session(回话作用域)

5、application(全局作用域)

6、websocket( HTTP WebSocket 作用域)

二、单例作⽤域VS 全局作⽤域

三、设置作用域

一、作用域是什么?

Bean的作用域是指Bean实例的生命周期及可见性范围,Spring框架定义了以下6种作用域:

  1.  singleton:单例作用域,所有对该Bean的请求都返回同一个Bean实例。
  2. prototype:原型作用域,每次请求时都创建一个新的Bean实例。
  3. request:请求作用域,每个HTTP请求都会创建一个新的Bean实例,该Bean实例仅在当前请求内有效。
  4.  session:会话作用域,每个HTTP会话都会创建一个新的Bean实例,该Bean实例仅在当前会话内有效。
  5. application:全局作用域,一个bean 定义对应于单个ServletContext 的生命周期。
  6. 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中默认的作用域,

使⽤ @Scope 标签就可以⽤来声明 Bean 的作⽤域,⽐如设置 Bean 的作⽤域,如下代码所示:
@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;}
}
@Scope 标签既可以修饰⽅法也可以修饰类,@Scope 有两种设置⽅式:
1. 直接设置值:@Scope("prototype")
2. 使⽤枚举设置:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

 

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

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

相关文章

亚马逊云科技通过生成式AI,帮助清华RIOS加速计算和分析的处理效率

近日,硬件创建平台Efabless宣布了其第一届“生成式AI开源芯片设计挑战赛”(AI Generated Open-Source Silicon Design Challenge)的评选结果。来自清华大学的RISC-V国际开源实验室(RIOS Lab)团队基于亚马逊云科技云上科…

链路追踪Skywalking应用实战

目录 1 Skywalking应用2 agent下载3 agent应用3.1 应用名配置3.2 IDEA集成使用agent3.3 生产环境使用agent 4 Rocketbot4.1 Rocketbot-仪表盘4.2 Rocketbot-拓扑图4.3 追踪4.4 性能分析4.5 告警4.5.1 警告规则详解4.5.2 Webhook规则4.5.3 自定义Webhook消息接收 1 Skywalking应…

spacy安装旧版本en_core_web_sm的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

宝塔面板一键部署Z-Blog博客 - 内网穿透实现公网访问

文章目录 1.前言2.网站搭建2.1. 网页下载和安装2.2.网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道(云端设置)3.3.Cpolar稳定隧道(本地设置) 4.公网访问测试5.结语 1.前言 Ubuntu系统作…

es6解构用法

一: 解构数组 二:解构对象 一: 解构数组 原理:模式(结构匹配), 索引值相同的完成赋值 总结:位置对应 二:解构对象 原理:模式(结构匹配), 属性名相同的完成赋值 {}{} 对象结构赋值的应用 常用的就以上两种 &#…

Shotcut for Mac:一款强大而易于使用的视频编辑器

随着数码相机的普及,视频编辑已成为我们日常生活的一部分。对于许多专业和非专业用户来说,找到一个易于使用且功能强大的视频编辑器是至关重要的。今天,我们将向您介绍Shotcut——一款专为Mac用户设计的强大视频编辑器。 什么是Shotcut&…

恒运资本:沪指涨逾1%,金融、地产等板块走强,北向资金净买入超60亿元

4日早盘,两市股指盘中强势上扬,沪指、深成指涨超1%,上证50指数涨近2%;两市半日成交约5500亿元,北向资金大举流入,半日净买入超60亿元。 截至午间收盘,沪指涨1.12%报3168.38点,深成指…

164到网络安全面试大全(附答案)

最近有不少小伙伴跑来咨询: 想找网络安全工作,应该要怎么进行技术面试准备?工作不到 2 年,想跳槽看下机会,有没有相关的面试题呢? 为了更好地帮助大家高薪就业,今天就给大家分享两份网络安全工…

基于卡尔曼滤波的锂电池状态估计MATLAB仿真及程序

完整资源请查看主页置顶博客(专享优惠) 该项目的目的是估计锂电池的荷电状态(SOC)。主要完成了扩展卡尔曼滤波(EKF)的实验、参数辨识和仿真。 项目中包括锂电池模型建立、参数辨识与验证、SOC估计采用扩展卡尔曼滤波(EKF),使用了两种方式实…

java八股文面试[多线程]——进程与线程的区别

定义 1、进程:进程是一个具有独立功能的程序关于某个数据集合的以此运行活动。 是系统进行资源分配和调度的独立单位,也是基本的执行单元。是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动。 进程结构…

SolVES4.1学习1——安装与使用教程

1、下载并安装 SolVES 4版本是QGIS插件,但实际使用过程中发现在最新版的QGIS安装该插件过程中,会报错或异常。因此需安装特定版本的软件。共需安装如下图软件及Java环境等。 根据官方文档安装好后,可以进行相关操作。 2、设置QGIS环境 QG…

IDEA报错:Plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘ not found

问题: 使用IDEA新建spring boot项目,报错如下: Plugin org.springframework.boot:spring-boot-maven-plugin: not found解决办法: 1.在本地maven仓库中找到spring-boot-maven-plugin的版本号 2.在pom.xml文件中添加对应的版本…

449. 序列化和反序列化二叉搜索树

诸神缄默不语-个人CSDN博文目录 力扣刷题笔记 Python3版代码提示: # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val x # self.left None # self.right None# Your Codec object will…

Redis 缓存预热+缓存雪崩+缓存击穿+缓存穿透

面试题: 缓存预热、雪萌、穿透、击穿分别是什么?你遇到过那几个情况?缓存预热你是怎么做的?如何造免或者减少缓存雪崩?穿透和击穿有什么区别?他两是一个意思还是载然不同?穿适和击穿你有什么解…

【数据结构-队列】队列介绍

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

OPPO手机便签数据搬家到华为mate60Pro手机怎么操作

今年8月底,华为上线了本年度的旗舰手机——华为mate60Pro。有不少网友都在抢购这台手机,不过在拿到新手机之后,还有一件重要的事情要做,这就是把旧手机中比较重要的数据,例如图片、短信、通讯录、联系人、便签等数据搬…

网络安全—0基础入门学习手册

前言 一、什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻与防…

Android Studio中创建java项目

1.创建普通的android工程 2.创建一个module 3.module类型选择java library 4.填写libary和class的名字 5.生成的工程如图所示 6.然后点击Run --- Edit Configurations... 选择Application选项 设置所需要的参数 选中myjavalib后点击OK。然后打开刚创建的lib的gradle 编辑gradl…

单片机简介

目录 1、单片机 2、CISC和RISC 3、 冯诺依曼结构和哈佛结构​编辑 1、单片机 单片机:Single-Chip Microcomputer,单片微型计算机,是一种集成电路芯片 ------------------------------------------------------------ 电脑&#xff1a; <--------> …

华为Mate60低调发布,你所不知道的高调真相?

华为Mate60 pro 这两天的劲爆新闻想必各位早已知晓&#xff0c;那就是华为Mate60真的来了&#xff01;&#xff01;&#xff01;并且此款手机搭载了最新国产麒麟9000s芯片&#xff0c;该芯片重新定义了手机性能的巅峰。不仅在Geekbench测试中表现出色&#xff0c;还在实际应用…