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

文章目录

  • 前言
  • 前言
  • 一、关于 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.rhkb.cn/news/94015.html

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

相关文章

在vue中使用swiper轮播图(搭配watch和$nextTick())

在组件中使用轮播图展示图片信息: 1.下载swiper,5版本为稳定版本 cnpm install swiper5 2.在组件中引入swiper包和对应样式,若多组件使用swiper,可以把swiper引入到main.js入口文件中: import swiper/css/swiper.css //引入swipe…

iOS 17 正式版预计 9 月中下旬发布,部分新功能延后推出

苹果公司预计将在 9 月中下旬推出 iOS 17 正式版,iPhone XS 及更新的机型可免费更新。这次更新包含了许多新功能,但是根据苹果公司的网站显示,并不是所有的功能都会立即可用。苹果表示有一些功能“将在今年晚些时候推出”,比如&am…

213、仿真-基于51单片机智能电表电能表用电量电费报警Proteus仿真设计(程序+Proteus仿真+原理图+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、原理图 五、程序源码 资料包括: 需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选…

Constanze‘s Machine

一、题目 二、分析 列表找规律&#xff0c;不同长度的u能够带来多少种不同的情况 发现规律&#xff0c;case满足斐波那契数列。 所以可以先预计算斐波那契数列fib。 #include<iostream> #include<cstring> #include<algorithm> #define int long long usi…

VS2019生成的DLL,给QT(MinGW版本)使用的小结

VS2019端&#xff1a; a 基于生成一个DLL的工程&#xff08;要注意生成是x86&#xff0c;还是x64的&#xff0c;需要和后面的QT的App工程对应&#xff09;&#xff0c;这里不多解释了&#xff0c;网上多的是&#xff1b; b 在cpp实现文件里&#xff0c;假如要导出一个这样的…

IDEA关闭项目,但是后台程序没有关闭进程(解决方案)

最近遇到一个很奇怪的问题&#xff0c;idea关闭项目后&#xff0c;系统进程没有杀死进程&#xff0c;再次执行的时候会提示端口占用&#xff0c;并提示Process exited with an error: 1 (Exit value: 1) 错误原因&#xff1a;应用程序关闭后&#xff0c;进程不能同步关闭 解决方…

【Nginx17】Nginx学习:目录索引、字符集与浏览器判断模块

Nginx学习&#xff1a;目录索引、字符集与浏览器判断模块 今天要学习的内容有几个还是大家比较常见的&#xff0c;所以学习起来也不会特别费劲。对于目录的默认页设置大家都不会陌生&#xff0c;字符集的设置也比较常见&#xff0c;而浏览器的判断这一块&#xff0c;可能有同学…

LeetCode ——二叉树篇(三)

刷题顺序及思路来源于代码随想录&#xff0c;网站地址&#xff1a;https://programmercarl.com 二叉树的定义及创建见&#xff1a; LeetCode ACM模式——二叉树篇&#xff08;一&#xff09;_要向着光的博客-CSDN博客 目录 116. 填充每个节点的下一个右侧节点指针 117. 填…

Doris2.0时代的一些机遇和挑战!

300万字&#xff01;全网最全大数据学习面试社区等你来&#xff01; 上个周五的时候&#xff0c;Doris官宣了2.0版本&#xff0c;除了在性能上的大幅提升&#xff0c;还有一些特性需要大家特别关注。 根据官网的描述&#xff0c;Doris在下面领域都有了长足进步&#xff1a; 日志…

python的 __all__ 用法

一、介绍 在Python中&#xff0c;__all__通常用于定义模块的公开接口。在使用from module import *语句时&#xff0c;此时被导入模块若定义了__all__属性&#xff0c;则只有__all__内指定的属性、方法、类可被导入&#xff1b;若没定义&#xff0c;则导入模块内的所有公有属性…

嵌入式系统中如何选择RTC电池?

RTC&#xff08;Real Time Clock&#xff09;是一种用于提供系统时间的独立定时器&#xff0c;它可以在系统断电或低功耗模式下继续运行&#xff0c;只需要一个后备电池作为供电源。在嵌入式系统中&#xff0c;选择合适的RTC电池时非常关键的&#xff0c;它会影响系统时间的准确…

pyqt和ros结合使用接受相机和点云消息并展示(附代码)

代码是 ROS 节点的 Python QT脚本,用于订阅 /turtle1/cmd_vel、/tracking_image 和 /test_pointcloud 话题。 脚本首先通过 ps 命令检查是否已启动 ROS 主节点,如果没有则启动一个新的 ROS 主节点。然后,它订阅 /turtle1/cmd_vel、/tracking_image 和 /test_pointcloud 话题…

Git 常用操作

一、Git 常用操作 1、Git 切换分支 git checkout命令可以用于三种不同的实体&#xff1a;文件&#xff0c;commit&#xff0c;以及分支。checkout的意思就是对于一种实体的不同版本之间进行切换的操作。checkout一个分支&#xff0c;会更新当前的工作空间中的文件&#xff0c;…

【日常积累】HTTP和HTTPS的区别

背景 在运维面试中&#xff0c;经常会遇到面试官提问http和https的区别&#xff0c;今天咱们先来简单了解一下。 超文本传输协议HTTP被用于在Web浏览器和网站服务器之间传递信息&#xff0c;HTTP协议以明文方式发送内容&#xff0c;不提供任何方式的数据加密&#xff0c;如果…

爬虫逆向实战(十三)--某课网登录

一、数据接口分析 主页地址&#xff1a;某课网 1、抓包 通过抓包可以发现登录接口是user/login 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现有一个password加密参数&#xff0c;还有一个browser_key这个可以写死不需要关心 请求头…

draw.io导出矢量图到word报错text is not svg - cannot display

先参考https://blog.csdn.net/a625750076/article/details/126384831 如果不行&#xff0c;可能是转存的问题 解决方法&#xff1a;直接在draw.io上操作 第一步 第二步 然后再word中粘贴&#xff0c;依旧是矢量图哦&#xff01;

494. 目标和

494. 目标和 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;数组回溯法动态规划 参考代码&#xff1a;数组回溯法__494目标和__动态规划 经验吸取 原题链接&#xff1a; 494. 目标和 https://leetcode.cn/problems/target-sum/description/ 完成情况&#…

09- DMA(DirectMemoryAccess直接存储器访问)

DMA 09 、DMA(DirectMemoryAccess直接存储器访问)DMA配置流程 09 、DMA(DirectMemoryAccess直接存储器访问) DMA配置流程 dma.c文件 main.c文件 详见《stm32中文参考手册》表57。

Redis_主从复制

8. 主从复制 8.1 简介 主从库采用读写分离的方式 读操作&#xff1a;主库、从库都可以处理写操作&#xff1a;首先写到主库执行&#xff0c;然后再将主库同步给从库。 实现读写分离&#xff0c;性能扩展 容灾快速恢复 8.2 主从复制步骤 创建一个目录 ,在root下创建一个m…

Snapdragon 8 Gen 3:详解骁龙最新一代处理器的性能与特点

Snapdragon 8 Gen 3正在为下一波最好的安卓手机提供动力。高通的旗舰移动芯片组长期以来一直是安卓手机中最好的芯片组之一&#xff0c;但它在一系列关键领域总是落后于苹果的A系列芯片——A17仿生芯片看起来也不例外。 Snapdragon 8 Gen 2和Galaxy芯片的Gen 2确实缩小了差距…