Java【Spring】Bean 的作用域和生命周期

news2024/9/20 10:34:53

文章目录

  • 前言
  • 前言
  • 一、关于 Bean 的作用域问题引入
  • 二、Bean 的作用域
    • 1, 什么是 Bean 的作用域
    • 2, Bean 的六种作用域
    • 3, 设置 Bean 的作用域(解决开篇的问题)
  • 三、Bean 的生命周期
  • 总结


前言

前言

各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你:
📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等
📗 Java数据结构: 顺序表, 链表, 堆, 二叉树, 二叉搜索树, 哈希表等
📘 JavaEE初阶: 多线程, 网络编程, TCP/IP协议, HTTP协议, Tomcat, Servlet, Linux, JVM等(正在持续更新)

Bean 的作用域和生命周期是面试中很常见的问题, 就连字节, 百度等大厂也常考, 本文就介绍 Bean 的六种作用域, 和生命周期( 5 步执行流程)
在这里插入图片描述


提示:是正在努力进步的小菜鸟一只,如有大佬发现文章欠佳之处欢迎批评指点~ 废话不多说,直接上干货!


一、关于 Bean 的作用域问题引入

  • 定义一个 User 类(@Component注解), 作为公共的 Bean, 此类中仅需设置一个成员属性 name, 并给定值, 再提供 setter() 和 toString() 方法即可 :
    在这里插入图片描述

  • 定义 UserComponent 类(@Component注解), 把上面的 User(公共Bean) 注入到当前类, 定义一个 run() 方法调用 User 类提供的 setter() 方法, 修改公共 Bean 的 name 属性
    在这里插入图片描述

  • 定义 UserComponent2 类(@Component注解), 不对公共Bean 进行修改, 只是访问它, 查看它的 name 是什么
    在这里插入图片描述

  • 在启动类中获取 UserComponent 和 UserComponent2 这两个 Bean, 分别调用 run() 方法
    在这里插入图片描述

我们期望 : 对于公共的 Bean , UserComponent 在使用时修改了它, 而 UserComponent2 在使用公共 Bean 时, 不被 UserComponent 的行为所干扰
也就是说 : 原本 Bean 中的 name = “喜羊羊”, UserComponent 修改成了"沸羊羊", 我们希望 UserComponent2 访问公共 Bean 时看到的还是"喜羊羊"

  • 观察结果 :
    在这里插入图片描述

为什么公共的 Bean 中的值被修改了? 那是不是意味着整个项目里, 一个 Bean 不应该被某个类访问并修改?

产生这种现象就是 Bean 的作用域导致的


二、Bean 的作用域

1, 什么是 Bean 的作用域

Bean 的作用域指的是Bean在整个 Spring 框架中的某个行为模式,比如 singleton 单例作用域表示 Bean 在整个 Spring 中只有一份,是全局共享的,当有一个用户修改了这个对象后,其他用户获取的就是这个修改后的对象

Bean 的作用域有 6 种:

  1. singleton:单例作用域

  2. prototype:原型作用域(也叫多例作用域)

  3. request:请求作用域

  4. session:会话作用域

  5. application:全局作用域

  6. websocket:HTTP WebSocket 作用域


2, Bean 的六种作用域

1, singleton:单例作用域

  • 该作用域下的 Bean 在 IoC 容器中只存在一个实例:获取 Bean(即通过applicationContext.getBean等方法获取)及装配Bean(即通过@Autowired注⼊)都是同一对象
  • 这是 Spring 默认的作用域
  • 通常是无状态的 Bean 使用的作用域 (无状态表示 Bean 对象的属性状态不需要修改)

2, prototype:原型作用域

  • 原型作用域也叫作多例作用域, 每次从 Spring 中获取 Bean 对象, 都会创建一份新的实例, @Autowired, @Resource 注入的对象以及 context 上下文 getBean 拿到的都是不同的 bean 对象
  • 通常是有状态的 Bean 使用的作用域 (有状态表示 Bean 对象的属性需要被修改)

3, request:请求作用域

  • 仅存在于 Spring MVC 中
  • 每一次 HTTP 请求都会创建新的实例, 类似于 prototype
  • 一次 HTTP 的请求和响应共享一个 bean

4, session:会话作用域

  • 仅存在于 Spring MVC 中
  • 在一个 HTTP session 中, 定义一个 Bean 实例

5, application:全局作用域

  • 仅存在于 Spring MVC 中
  • 在⼀个http servlet Context中,定义一个 Bean实例

6, websocket:HTTP WebSocket 作用域

  • 仅存在于 Spring MVC 中
  • 在一个 HTTP WebSocket 的生命周期中,定义一个 Bean 实例, WebSocket 的每次会话中,保存了一个 Map 结构的头信息,将用来包裹客户端消息头, 第一次初始化后,直到 WebSocket 结束都是同一个 Bean

3, 设置 Bean 的作用域(解决开篇的问题)

了解了 Bean 作用域, 我们知道, 在开篇引入的示例中, 由于 Bean 的默认作用域是 singleton, 如果改成 prototype , 那么在 UserComponent 和 UserComponent2 中, 注入 Bean 时就会创建一份新的实例, 哪怕有一万个类都是用这个 Bean 也不会互相干扰

声明 Bean 的作用域 : 使用 @Scope 注解

  • 使用方式1 : @Scope(“prototype”)
    在这里插入图片描述
    在这里插入图片描述

  • 使用方式2 : @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    在这里插入图片描述
    在这里插入图片描述

@Scope 可以加在类上, 配合类注解(@Controller、@Service、@Repository、@Component、@Configuration )使用
也可以加在方法上配合方法注解(@Bean)使用


三、Bean 的生命周期

所谓的生命周期指的是一个对象从诞生到销毁的整个生命过程, 我们把这个过程就叫做一个对象的生命周期, Bean 的生命周期就是 Bean 从诞生到销毁的过程

Bean 的生命周期基本分为以下 5 步 :

  1. 实例化 Bean (开辟内存空间)

  2. 设置属性( Bean 注入)

  3. 初始化 Bean
    3.1, 执行实现了各种 Aware (通知)接口的方法
    3.2, 执行初始化的前置方法
    3.3, 执行初始化方法
    3.3, 执行初始化的后置方法

  4. 使用 Bean

  5. 销毁 Bean

第二步和第三步的顺序能调换吗?(为什么要先注入再初始化?)
答案是否定的, 在第三步(初始化 Bean )时, 会执行各种各样的方法, 在这些方法中, 如果使用注入进来的 Bean, 但此时如果还没有把 Bean 注入进来, 还怎么使用? 可想而知会产生异常, 所以是先注入 Bean , 再进行初始化 Bean


总结

以上就是本篇的所有内容了, 如果本篇对你有帮助,请点赞收藏支持一下,小手一抖就是对作者莫大的鼓励啦😋😋😋~


上山总比下山辛苦
下篇文章见

在这里插入图片描述

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

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

相关文章

前端大屏常用的适配方案

假设我们正在开发一个可视化拖拽的搭建平台,可以拖拽生成工作台或可视化大屏,或者直接就是开发一个大屏,首先必须要考虑的一个问题就是页面如何适应屏幕,因为我们在搭建或开发时一般都会基于一个固定的宽高,但是实际的…

【K210】K210学习笔记一——sensor

【K210】K210学习笔记一——sensor 前言sensor的配置模块导入模块配置模块各配置解释 完整源码 前言 本人大四学生,电赛生涯已经走到尽头,一路上踩过不少坑,但运气也不错拿了两年省一,思来想去,决定开始写博客&#x…

基于Mysql+Vue+Django的协同过滤和内容推荐算法的智能音乐推荐系统——深度学习算法应用(含全部工程源码)+数据集

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境MySQL环境VUE环境 模块实现1. 数据请求和储存2. 数据处理计算歌曲、歌手、用户相似度计算用户推荐集 3. 数据存储与后台4. 数据展示 系统测试工程源代码下载其它资料下载 前言 本项目以丰富的网易云音乐数据为基…

To B和To C含义与区别

1 定义 ToB,指的是公司的产品或服务所面向的用户是企业。ToC,指的是公司的产品或服务所面向的用户是广大个体用户。 2 用户群体 对ToB产品来说,面对的是客户(Business),客户是各种企业,组织机构…

VS QT报错中文编码问题 error C2001:常量中有换行符

VS报错 VS中基于QT开发,在输入中文处显示报错,使用以下几种方法均无效: 中文处添加 QString::fromLocal8Bit("机器人")文件头部添加 #pragma execution_character_set("utf-8") 解决 在高级保存选项里选择该文件的编…

边缘智能聚焦嵌入式世界

没有什么超出了我们的想象力的极限,我们习惯于在间谍电影中看到的东西需要进行大规模升级,以超越现在认为的标准。 德国纽伦堡—一切都超出了我们的想象范围,而且我们习惯于在间谍电影中看到的东西需要进行大规模升级,以超越现在认…

MySQL索引(Index)

Index 数据库中的索引(Index)是一种数据结构,用于提高数据库查询性能和加速数据检索过程。索引可以看作是数据库表中某个或多个列的数据结构,类似于书中的目录,可以帮助数据库管理系统更快地定位和访问数据。它们是数…

初始C语言(6)——详细讲解表达式求值以及其易错点

系列文章目录 第一章 “C“浒传——初识C语言(1)(更适合初学者体质哦!) 第二章 初始C语言(2)——详细认识分支语句和循环语句以及他们的易错点 第三章 初阶C语言(3)——…

huttoll

Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。 Hutool是项目中“util”包友好的替代,它节省了开发…

【NepCTF2023】复现

文章目录 【NepCTF2023】复现MISC与AI共舞的哈夫曼codesc语言获取环境变量 小叮弹钢琴陌生的语言你也喜欢三月七么Ez_BASIC_IImisc参考 WEBez_java_checkinPost Crad For You独步天下配置环境独步天下-镜花水月环境变量提权 独步天下-破除虚妄总结 独步天下-破除试炼_加冕成王知…

Android岗位技能实训室建设方案

一 、系统概述 Android岗位技能作为新一代信息技术的重点和促进信息消费的核心产业,已成为我国转变信息服务业的发展新热点:成为信息通信领域发展最快、市场潜力最大的业务领域。互联网尤其是移动互联网,以其巨大的信息交换能力和快速渗透能力…

三种MMIC放大器偏置电压顺序

HBT自偏置放大器偏置顺序 1、有两种HBT放大器,自偏置和带电流控制的自偏置,下图是HBT自偏置放大器最简单的偏置。这些放大器只需要接通集电极电压。有一个设置电流的偏置电阻。放大器有一个电流反射镜来控制基极电压。 2、 电阻值的计算 3、打开电源并…

代码审计-java项目-组件漏洞审计

代码审计必备知识点: 1、代码审计开始前准备: 环境搭建使用,工具插件安装使用,掌握各种漏洞原理及利用,代码开发类知识点。 2、代码审计前信息收集: 审计目标的程序名,版本,当前环境(系统,中间件…

QT-Mysql数据库图形化接口

QT sql mysqloper.h qsqlrelationaltablemodelview.h /************************************************************************* 接口描述:Mysql数据库图形化接口 拟制: 接口版本:V1.0 时间:20230727 说明:支…

ipadOS External cameras

必须是USB-C接口,所以在使用的时候需要确认USB video Class(UVC) 好像也可以使用HDMI AVFoundation 用于处理一批视频多媒体数据的创建,编辑,播放和捕获,时音频视频功能的基础库。 有什么功能呢: 1.可以支持多种音频…

RocketMQ(模式详解,安装)及控制台安装

下载 环境 64位操作系统,推荐 Linux/Unix/macOS 64位 JDK 1.8下载地址 https://rocketmq.apache.org/zh/download/ RocketMQ 的安装包分为两种,二进制包和源码包。 二进制包是已经编译完成后可以直接运行的,源码包是需要编译后运行的。 单…

【Android】解决Lint found fatal errors while assembling a release target

报错信息: Android在debug模式下打包没有问题,但是在打包release版本时出现一下问题: 结果图 原因 我项目的原因是因为把正式、测试地址放到代码里了,忘记选中正式环境的地址,导致打正式包有问题;大家如果…

ASEMI肖特基模块MBR400100CT参数规格

编辑-Z MBR400100CT参数描述: 型号:MBR400100CT 反向重复峰值电压(VRRM):100V 正向直流电流(I0):400A 正向(不重复)浪涌电流(IFSM):3300A 结温 (TJ):-40 to 175℃ 储存温度(T…

mybatis生命周期和作用域

前言 作用域和生命周期错误使用会导致并发问题。 mybatis执行过程: 1、SqlSessionFactoryBuilder SqlSessionFactoryBuilder 占用XML资源来创建多个 SqlSessionFactory实例; SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就…

MBSE项目的全新数据、信息与知识管理方法|数据模型标准化思路

仅供学习使用 An original Data, Information and Knowledge management approach for model-based engineering projects 作者:M. El Alaoui, S. Rabah, V. Chapurlat, V. Richet , R. Plana 来源:https://doi.org/10.1016/j.ifacol.2022.10.135 文章详…