【Spring全家桶系列】Spring之Bean的生命周期

文章详细介绍了Spring框架中Bean的生命周期,包括初始化、使用和销毁阶段。通过代码示例展示了如何在XML配置文件中定义初始化和销毁方法,以及通过实现InitializingBean和DisposableBean接口来控制生命周期。同时,对比了close()方法和registerShutdownHook()方法关闭容器的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

⭐️前面的话⭐️

本文已经收录到《Spring框架全家桶系列》专栏,本文将介绍Spring的生命周期的过程,以及基于xml配置文件的方式在程序中体现生命周期的过程。

📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创,CSDN首发!
📆首发时间:🌴2023年4月19日🌴
✉️坚持和努力一定能换来诗与远方!
💭推荐书籍:📚《无》
💬参考在线编程网站:🌐牛客网🌐力扣🌐acwing
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!



在这里插入图片描述


1.Bean的生命周期

Bean生命周期,顾名思义,它本质上就是生命周期的概念,就是描述某事物从诞生到消亡的过程,那Bean的生命周期指的就是Bean从诞生到消亡的过程,Bean的生命周期大致如下:

  1. 初始化Ioc容器。
  2. 创建对象,并分配内存。
  3. 执行构造方法。
  4. 执行属性注入,即执行set方法。
  5. 执行bean的初始化方法。
  6. bean对象已经实例化完成,可以使用bean完成业务操作。
  7. 任务执行完毕,bean对象进入销毁阶段,执行销毁前方法,并关闭容器。

总的来说,Bean的生命周期分为三个阶段,1-5属于实例化阶段,6表示使用阶段,7表示销毁阶段。

2.模拟Bean的生命周期

下面我们通过代码的方式来说明Bean的生命周期,项目的目录如下:
1
首先我们在LifeDao除了写一个save方法,再增加一个init方法模拟初始化,destory方法模拟销毁方法。

2
我们的验证程序如下:
3
我们将LifeDao注册到容器当中,xml配置如下:
4
我们直接这样写,肯定是不能够执行到initdestory方法的,我们需要进行配置,那不用说也知道,需要在xml中对lifeDao进行配置,在bean标签当中,init-method属性可以指定初始化的方法是哪一个,destroy-method属性可以指定销毁前执行的方法是哪一个,所以我们可以对这两个属性进行配置。

5
我们来看看运行结果:
6
我们发现init方法执行了,但是destroy方法并没有执行,这是因为我们的程序是在jvm虚拟机上执行的,当我们的验证代码执行完毕后,虚拟机也随之关闭了,并没有给destroy方法执行的机会,下面我们来进行配置,让程序能够体现出destroy方法的执行。

首先想到最暴力的方式,那就是在验证程序当中直接将容器销毁的过程运行一遍,容器销毁的过程中就会去执行对应容器中Bean对象的destroy方法,那如何做呢?直接调用contextclose方法即可,不过该方法在ApplicationContext接口中是没有的,它是存在与ConfigurableApplicationContext接口中,在后续的实现类中实现了close方法。

7
所以我们需要通过使用ConfigurableApplicationContext引用或者直接使用ClassPathXmlApplicationContext引用来调用close方法。

8
运行结果:
9
这是最直接最暴力的方法,处了这个方法,我们还可以利用注册钩子关闭容器的方式来实现,其实就是告诉jvm,在关闭jvm之前,先帮我把容器关掉,关好了再进行jvm虚拟机的销毁。

怎么注册钩子关闭容器呢?其实就是调用contextregisterShutdownHook方法,这个方法同样在ApplicationContext接口中是没有的,需要使用其实现类引用来进行调用。

10
运行结果:
11
既然close方法和registerShutdownHook方法都可以在jvm销毁前关闭容器,那这两者的区别是什么呢?

  • close方法的含义是关闭当前的容器,也就是说,只要执行该方法,就会将容器关闭,并执行destory方法,执行该方法后因为容器销毁了,那如果在业务执行完毕之前就销毁,那业务代码就无法取到容器中的对象,就会发生异常报错。
  • registerShutdownHook方法的含义是给jvm一个标记,告诉jvm在注销之前记得关闭容器,该方法在任何地方执行的效果都是一样的,只会在jvm注销前执行。

分析上面的实现过程,会发现添加初始化和销毁方法,即需要编码也需要配置,实现起来步骤比较多也比较乱。

最后还有一种方法,是通过实现接口的方式来说明Bean的生命周期过程,这样写的好处是不需要在xml文件当中设置init-method方法和destroy-method属性。
接下来在LifeServiceImpl完成这两个接口的使用:

修改LifekServiceImpl类,添加两个接口InitializingBeanDisposableBean并实现接口中的两个方法afterPropertiesSetdestroy
12
afterPropertiesSet方法表示在set方法执行后执行,一般用来进行bean的初始化操作,可见bean的初始化在set注入属性之后执行。
destroy方法就是表示bean对象的销毁过程了。

验证代码:
13
执行结果:
14

3.总结

(1)关于Spring中对bean生命周期控制提供了两种方式:

  • 在配置文件中的bean标签中添加init-methoddestroy-method属性。
  • 类实现InitializingBeanDisposableBean接口。

(2)对于bean的生命周期控制在bean的整个生命周期中所处的位置如下:

  1. 初始化Ioc容器。
  2. 创建对象,并分配内存。
  3. 执行构造方法。
  4. 执行属性注入,即执行set方法。
  5. 执行bean的初始化方法。
  6. bean对象已经实例化完成,可以使用bean完成业务操作。
  7. 任务执行完毕,bean对象进入销毁阶段,执行销毁前方法,并关闭容器。

(3)关闭容器的两种方式:

ConfigurableApplicationContextApplicationContext的子接口,里面包含close()方法和registerShutdownHook()方法可以实现关闭容器。

两者的区别:

  • close方法的含义是关闭当前的容器,也就是说,只要执行该方法,就会将容器关闭,并执行destory方法,执行该方法后因为容器销毁了,那如果在业务执行完毕之前就销毁,那业务代码就无法取到容器中的对象,就会发生异常报错。
  • registerShutdownHook方法的含义是给jvm一个标记,告诉jvm在注销之前记得关闭容器,该方法在任何地方执行的效果都是一样的,只会在jvm注销前执行。

觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦!

1-99

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未见花闻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值