【Spring(五)】带你深入了解bean的生命周期

news2024/10/6 10:42:05

1.5 bean的生命周期

  • bean的实例化已经说完了,我们最后再来讲讲bean的生命周期

  我们主要来围绕着bean生命周期控制来学习,那么什么是生命周期呢?其实就是一个东西从创建到消亡的完整过程,比如人从出生到死亡的整个过程,我们称这是完整的生命周期,那bean的生命周期是什么呢?bean是对象,也就是这个对象从创建到销毁的整个过程,那我们要想做它的控制,其实就是在它创建以后到销毁之前做一些事情,接下来我们在程序中来说说怎么控制它的生命周期👇👇

在这里插入图片描述
在这里插入图片描述

  在这有一点和前边不同,现在我们在这运行的是dao,也就是我在这配置的虽然有Service、Dao,但是我运行的时候只是拿的dao,也就是Service并未参与到我们的程序之中,那我们现在就来控制一下dao的生命周期,在这里主要有两个阶段,第一个阶段是bean创建之后,我们想控制它做一些事情,比如说你这个bean前边加载的时候要做一些数据的准备,那你就可以在这个阶段做,另外一个就是在bean消亡之前,我们做一些事情,那看来这里边需要两个操作来代表它的前和后,我们来定义两个方法👇👇。

在这里插入图片描述

  在这里我们写的简单一点,只是为了看它的运行效果,加上这两个方法以后,我们去运行我们的程序,会发现,这两个方法是绝对不会运行的 👇👇,这是为什么呢?在BookDaoImpl里边随随便便写两个方法就能代表它的初始化和销毁操作了吗?,显然是不行的❗❗

在这里插入图片描述

  那应该怎么办,我们需要去applicationContext.xml配置文件中去做一些配置👇👇我们现在在控的是dao层的bean,那肯定是在它上边加配置,它的运行是非常简单的👇👇,运行完我们会发现:init执行了,destory为什么没有执行呢?

在这里插入图片描述
在这里插入图片描述

  接下来我们就来说说为什么这个销毁操作没有执行,其实说到这里我们还是要说一个东西,我们现在运行的程序是在Java虚拟机中,我们可以这么想,虚拟机启动了,然后IOC容器加载了配置也启动了,然后把bean初始化了,然后我们从里边拿到bean了,然后执行完了,下一个动作是什么?程序执行完了,虚拟机退出了,也就是虚拟机在退出的时候没有给你的bean销毁的这样一个机会,那怎么做才能做到这件事呢?其实方式有两种,在这里我们简单学习一下👇👇

  第一种就是在你的虚拟机退出去之前,我把我这个容器给关闭了,我们一打,发现没有这个方法👇👇,这是因为我们现在调的这个ctxApplicationContext这个接口,这个接口是不具有这个方法的,如果我们需要在我们的程序中正常关闭我们的容器,我们需要用ClassPathXmlApplicationContext这个类就可以关了👇👇。

在这里插入图片描述
在这里插入图片描述

  现在close就能用了,我们再来运行一下👇👇,运行之后我们就能看到destory()方法被执行了🎉🎉

在这里插入图片描述
在这里插入图片描述

  我们第一种方式是比较暴力的方式关闭容器,也就是我直接关闭了,对于我们的容器来说,还提供有另外一种方式来关闭容器,叫做:设置关闭钩子🎈🎈。
  怎么理解呢,说简单一点就是我容器启动以后,我先在那加了一个标记,什么意思呢,你虚拟机退之前呢别忘了让我容器关完你再退,就是这么一回事,我们来看看关闭钩子怎么去写👇👇。

在这里插入图片描述

  把上边这句话加上以后,也就意味着我们的容器在启动以后,如果要关虚拟机之前,把它的容器先关掉,那么这样也是可以的,我们再来运行一下👇👇。

在这里插入图片描述

  如果我们把注册钩子那句代码换一下位置也是可以的,也就是这个关闭钩子在任何时间都可以。对于以上两种关闭容器的区别我们要说一下:close关闭相对来说比较暴力一些,如果你要把这句代码挪到上边去,这个效果就完全不一样了,假如我们将它放到如下位置👇👇,结果会报错👇👇

在这里插入图片描述
在这里插入图片描述

  我们来分析报错的原因,我们创建一个容器,并且初始化以后,直接关闭容器,那容器都关了,后边的事还能做吗,肯定是不能了,这个错误的意思就是你的容器要么没初始化,要么已经关闭了,但是我们看上图可以发现☝️☝️,对于bean的生命周期管理的操作,是不是也都运行了,在这我们区分了一下两种关闭容器方式的不同🎉🎉。

  那有人就问了,以后我们用哪一种呢,其实这两种在我们实际开发中都不用写,我们最终做的是web应用,关闭容器这件事应该伴随着tomcat一块玩的,我们会在web中继续学习这些东西,到这里我们就学完了生命周期的控制操作,这时候又有一个问题了,我们在配置的时候,随便写一个名字配给init-method、destory-method属性,那么Spring容器就觉得有点乱,干脆按照它的要求来写,我们就省了这两个属性配置了🎉🎉

  按照它的要求,那就必须按照它的套路来写,怎么做的呢,我们在service的实现类上面按照Spring接口的方式来把它的生命周期给做一遍,在这里要实现两个接口:InitializingBean(初始化bean)、DisposableBean,这两个接口对应一个方法,我们把它加上并运行一下👇👇

在这里插入图片描述
在这里插入图片描述
注意:我们虽然用的是dao运行,但是我们的service的bean也是被加载的,所以该运行的还是会运行的❗❗❗
在这里插入图片描述

  我们可以看到,运行结果是正确的,在这里我们又学习了一种控制生命周期的方法:就是使用接口的方式也能控制,在这我们来学习一个小细节,初始化的方法叫做:afterPropertiesSet,怎么解释呢,after:在什么之后,在什么之后呢?PropertiesSet:在属性设置之后,啥意思,注意观察,我在setBookDao方法里边打印一句话,我们来观察它的运行时间,我们只观察set....的执行时间和service init的执行时间的顺序👇👇。

在这里插入图片描述
在这里插入图片描述

  我们运行完可以发现 set…的执行时间在service init的执行时间之前,,也就是说:当你的属性设置完以后,才去运行 afterPropertiesSet()这个操作,所以它才叫afterPropertiesSet:在属性设置之后。到这我们就学习完了Spring使用接口来控制bean的生命周期这种方式,使用这种方式我们就不需要在配置文件中去配属性了🎈🎈。

  对于我们生命周期的控制,有两种格式,一个是配置的方式,一个是使用接口的方式,对于这种方式我们了解一下就可以了,除了这两种控制生命周期的方式以外,我们还要了解我们bean在初始化的过程中都经历了哪些阶段👇👇
  首先第一个阶段是创建对象,分配内存,我们可以理解为是new在做的事情,然后执行构造方法,构造方法执行完以后,整个对象就创建完了,接下来才是我们的set操作,也就是执行属性注入,刚才我们也看到了,set操作是优先于我们bean的初始化的,然后set操作完成以后,才是执行bean的初始化方法,这是初始化容器的阶段,接下来就是我们的bean的销毁操作:执行bean销毁方法了,注意:这是在关闭销毁容器之前完成的,这是关闭/销毁容器阶段,至于你执行你的业务bean的操作,比如我们调save方法,这和前面两个阶段是不挨着的,它只能算是使用bean的整个过程

总结

  以上就是我们 bean的生命周期的全部内容,我们需要知道的是容器关闭前才会触发bean的销毁,最后,如果有什么错误的话,大家可以私信我📬📬,希望大家多多关注+点赞+收藏 ^_^🙏🙏,你们的鼓励是我不断前进的动力💪💪!!!

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

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

相关文章

【MySQL进阶】深入理解redoLog日志

【MySQL进阶】深入理解redoLog日志 文章目录【MySQL进阶】深入理解redoLog日志一:redo日志概述二:redo日志格式三:Mini-Transaction1:以组的形式写入redo日志2:Mini-Transaction的概念四:redo日志的写入过程…

富淼转债,优彩转债上市价格预测

富淼转债基本信息转债名称:富淼转债,评级:A,发行规模:4.5亿元。正股名称:富淼科技,今日收盘价:18.25,转股价格:20.26。当前转股价值 转债面值 / 转股价格 * …

(3分钟速览)SLAM中的三大金刚-H E F Matrix

编辑切换为居中添加图片注释,不超过 140 字(可选)三个矩阵的自由度:单应矩阵H 自由度8基础矩阵F 自由度7本质矩阵E 自由度5或者8,这个是根据使用旋转矩阵还是旋转向量编辑切换为居中添加图片注释,不超过 14…

每日一题之Vue的异步更新实现原理是怎样的?

最近面试总是会被问到这么一个问题:在使用vue的时候,将for循环中声明的变量i从1增加到100,然后将i展示到页面上,页面上的i是从1跳到100,还是会怎样?答案当然是只会显示100,并不会有跳转的过程。…

计算机基础——计算机应用领域以及未来发展趋势

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.计算机应用领域 1.信息管理 2.过程控制 3.计算机辅助技术 1&#xff09…

一天天过去,每天该如何过?

刚跨了年,又快到春节,日子就这样一天天过去。如何过好这一生是个大命题,不如简化点考虑下如何过好一天?人的时间大体分为两类:主动的,可以自由支配;被动的,等着被安排。过去我在互联…

MCU-51:LCD1602详解

目录一、LCD1602简介1.1 显示原理1.2 引脚及应用电路1.3 技术参数1.4 引脚功能1.5 指令集1.6 连接方式二、时序图2.1 写时序2.2 读时序三、代码演示3.1 LCD1602.c3.2 示例注意:一定要看一、LCD1602简介 LCD1602(Liquid Crystal Display)液晶…

能量加油站Java上

1、final 在 Java 中有什么作用? 1、final 修饰的类叫最终类,该类不能被继承。2、final 修饰的方法不能被重写3、final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改 2、Math.round() 指向上取整 补充 Double.do…

01背包问题再探

原题: 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入格式 第一行两个整…

盖子的c++小课堂——第五讲:for 循环

前言 hi,大家好,我是盖子的盖,最近大家都放假了吗,反正我还没有,我们期末考才刚开始考呜呜呜,真羡慕那些放假了的童鞋们~~(╥╯^╰╥)~~ 好啦,废话不多说,开始今天的小课堂吧~~ 上…

厚积薄发打卡Day113:Debug设计模式:设计原则(一)<开闭原则、依赖倒置、单一职责>

厚积薄发打卡Day113&#xff1a;Debug设计模式&#xff1a;设计原则&#xff08;一&#xff09;<开闭原则、依赖倒置、单一职责> 开闭原则 定义 一个软件实体如类、模块和函数应该对扩展开放&#xff0c;对修改关闭。其优点&#xff1a;提高软件系统的可复用性及可维护…

JavaEE多线程-创建线程(Thread)

目录一、线程(Thread)1.1 Thread类中的构造方法1.2 启用线程的方法二、创建第一个多线程三、多线程并发执行简单演示四、多线程并发执行的优势五、Thread的常见构造方法和属性5.1 属性5.2 方法六、中断线程七、线程等待一、线程(Thread) 线程是操作系统中的概念. 操作系统内核…

LeetCode二叉树经典题目(六):特殊位置构造二叉树

目录 21. LeetCode404. 左叶子之和 22.LeetCode513. 找树左下角的值 23. LeetCode112. 路径总和 24. LeetCode113. 路径总和 II 25. LeetCode106. 从中序与后序遍历序列构造二叉树 26. LeetCode105. 从前序与中序遍历序列构造二叉树​编辑 27. LeetCode654. 最大二叉树 …

LED、Mini LED、Micro LED、LCD、OLED技术

1、传统led、miniled、microled的异同 2、OLED OLED&#xff08;Organic Light-Emitting Diode&#xff09;&#xff0c;又称为有机电激光显示、有机发光半导体&#xff08;Organic Electroluminescence Display&#xff0c;OLED&#xff09;。OLED属于一种电流型的有机发光器…

S32K144-hello_word点灯

官方提供了很多的参考例程&#xff0c;每个历程分别配置了不同的外设&#xff0c;这里挨个尝试解读一下。 示例效果 RGB红灯绿灯交替闪烁。 导入示例 示例文件所在目录&#xff1a; 该示例使用PCC和PORT模块交替切换两个LED。 硬件连接 配置引脚功能 生成代码 S32DS自带引…

C#上位机基础学习_登录窗体的创建方法和步骤

C#上位机基础学习_登录窗体的创建方法和步骤 本次和大家分享如何制作一个简单的登录窗体。具体的方法和步骤可以参考以下内容: 如下图所示,打开Visual Studio 2019,新建一个Windows 窗体应用(.NET Framework), 如下图所示,在窗体中添加Label标签、Text文本框、Button按…

Java中常用API总结(5)—— Object类中的深克隆和浅克隆

对象克隆一、前言二、浅克隆1.概述2.实例1️⃣思路2️⃣继承cloneable接口底层原理3️⃣重写clone方法底层原理3.代码实现三、深克隆1.概述2.实例3.代码实现四、结语一、前言 本文将详细讲述Object类中的对象克隆方法&#xff0c;其中包含深克隆和浅克隆&#xff0c;两者有一定…

算法竞赛100天第2天——STL IN C++(算法竞赛必备知识总结汇总)

本文已收录于专栏 &#x1f332;《百日算法竞赛》&#x1f332; 目录 前言&#xff1a; 序列容器 序列的要求&#xff1a; 1.vector vector常用方法 vector遍历 2、deque 头文件 方法 3、list 头文件 方法 4、queue 方法&#xff1a; 关联容器 1、map 2、se…

SWPUCTF 2022新生赛部分wp

&#x1f60b;大家好&#xff0c;我是YAy_17&#xff0c;是一枚爱好网安的小白。 本人水平有限&#xff0c;欢迎各位大佬指点&#xff0c;一起学习&#x1f497;&#xff0c;一起进步⭐️。⭐️此后如竟没有炬火&#xff0c;我便是唯一的光。⭐️[SWPUCTF 2022 新生赛]ez_ez_ph…

【算法】链表

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录链表数组转链表链表转数组往链表的前面增加一个节点获得指定位置的值在链表的末尾增加一个节点在…