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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

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的销毁最后如果有什么错误的话大家可以私信我📬📬希望大家多多关注+点赞+收藏 ^_^🙏🙏你们的鼓励是我不断前进的动力💪💪

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Spring