首页 > 其他分享 >Spring---Bean的生命周期

Spring---Bean的生命周期

时间:2024-11-25 09:32:49浏览次数:8  
标签:销毁 Spring 生命周期 接口 --- Bean 调用 方法

什么是Bean的生命周期

  • Bean 的生命周期就是:对象从创建开始到最终销毁的整个过程,Bean 对象从创建到销毁中经历了哪些过程
  • 什么时候创建Bean对象?
  • 创建Bean对象的前后会调用什么方法?
  • Bean对象什么时候销毁?
  • Bean对象的销毁前后调用什么方法?
  • Spring其实就是一个管理Bean对象的工厂,它负责对象的创建,对象的销毁等。

为什么要知道Bean的生命周期

  • 生命周期的本质是:在哪个时间节点上调用了哪个类的哪个方法。
  • 我们需要充分的了解在这个生命线上,都有哪些特殊的时间节点,在这些特殊节点会调用哪个类的哪个方法。
  • 我们可能需要在某个特殊的时间点上执行一段特定的代码,只有我们知道了特殊的时间节点都在哪,在该特殊节点会调用什么方法,我们才可以确定代码写到哪,这段代码就可以放到这个节点上,当生命线走到这里的时候,自然会被调用。

Bean的生命周期之5步

  • Bean生命周期的管理,可以参考Spring的源码:AbstractAutowireCapableBeanFactory类的doCreateBean()方法。

  • Bean生命周期可以粗略的划分为五大步:

  • 第一步:实例化Bean,调用无参构造方法创建对象

  • 第二步:Bean属性赋值,调用对象的set方法,进行set注入

  • 第三步:初始化Bean,调用Bean的init方法(该方法需要自己写,然后进行配置)

  • 第四步:使用Bean

  • 第五步:销毁Bean,调用Bean的Destroy方法(该方法需要自己写,然后进行配置)

  • 进行Bean的销毁,必须关闭Spring容器,只有关闭了Spring容器,Bean才会进行销毁
    image.png

Bean生命周期之7步

  • Bean生命周期七步,比Bean生命周期五步,在初始化Bean的前和后,添加了两步。

  • 在以上的5步中,第3步是初始化Bean,在初始化前和初始化后执行的方法为“Bean后处理器”的before和after方法,通过“Bean后处理器”我们可以在初始化Bean的前后添加需要执行的代码。

  • 要添加“Bean后处理器”需要类实现BeanPostProcessor类,并且重写before和after方法

  • Bean生命周期之7步:

  • 第一步:实例化Bean

  • 第二步:Bean属性赋值

  • 第三步:执行“Bean后处理器”的before方法。

  • 第四步:初始化Bean

  • 第五步:执行“Bean后处理器”的after方法。

  • 第六步:使用Bean

  • 第七步:销毁Bean
    image.png

Bean生命周期之十步

  • Bean生命周期十步比七步多的三步:

  • 点位1:在“Bean后处理器”before方法之前,在Bean属性赋值之后

  • 点位2:在“Bean后处理器”before方法之后,在Bean的初始化之前

  • 点位3:使用Bean之后,或者说销毁Bean之前

  • 添加的这三个点位的特点:都是在检查你这个Bean是否实现了某些特定的接口,如果实现了这些接口,则Spring容器会调用这个接口中的方法。
    image.png|300

实现 Aware 相关接口:

  • Aware相关的接口包括:BeanNameAware、BeanClassLoaderAware、BeanFactoryAware

  • 当Bean实现了BeanNameAware,Spring会将Bean的名字传递给Bean。

  • 当Bean实现了BeanClassLoaderAware,Spring会将加载该Bean的类加载器传递给Bean。

  • 当Bean实现了BeanFactoryAware,Spring会将Bean工厂对象传递给Bean。

  • 在“Bean后处理器”before方法之前,会检查Bean是否实现了Aware相关的接口,如果实现了接口则调用这些接口中的方法。然后调用这些方法的目的是为了给你传递一些数据,让你更加方便使用。

完整生命周期

1.创建 Bean 的实例:Bean 容器首先会找到配置文件中的 Bean 定义,然后使用 Java 反射 API 来创建 Bean 的实例。
2.Bean 属性赋值/填充:为 Bean 设置相关属性和依赖,例如@Autowired 等注解注入的对象、@Value 注入的值、setter方法或构造函数注入依赖和值、@Resource注入的各种资源。
3.Bean 初始化
1.检查Aware相关接口

  • 如果 Bean 实现了 BeanNameAware 接口,调用 setBeanName()方法,传入 Bean 的名字
  • 如果 Bean 实现了 BeanClassLoaderAware 接口,调用 setBeanClassLoader()方法,传入 ClassLoader对象的实例。
  • 如果 Bean 实现了 BeanFactoryAware 接口,调用 setBeanFactory()方法,传入 BeanFactory对象的实例
  • 与上面的类似,如果实现了其他 *.Aware接口,就调用相应的方法。
    2.调用Bean后处理器(BeanPostProcessor)的before方法
  • 如果有和加载这个 Bean 的 Spring 容器相关的 BeanPostProcessor 对象,执行postProcessBeforeInitialization() 方法
    3.检查InitializingBean接口
  • 如果 Bean 实现了InitializingBean接口,执行afterPropertiesSet()方法。
  • 如果 Bean 在配置文件中的定义包含 init-method 属性,执行指定的方法。
    4.实现Bean后处理器(BeanPostProcessor)的after方法
  • 如果有和加载这个 Bean 的 Spring 容器相关的 BeanPostProcessor 对象,执行postProcessAfterInitialization() 方法。

5.销毁 Bean:销毁并不是说要立马把 Bean 给销毁掉,而是把 Bean 的销毁方法先记录下来,将来需要销毁 Bean 或者销毁容器的时候,就调用这些方法去释放 Bean 所持有的资源。

  • 如果 Bean 实现了 DisposableBean 接口,执行 destroy() 方法。
  • 如果 Bean 在配置文件中的定义包含 destroy-method 属性,执行指定的 Bean 销毁方法。或者,也可以直接通过@PreDestroy 注解标记 Bean 销毁之前执行的方法。
    image.png|300

如何记忆呢?

  1. 整体上可以简单分为四步:实例化 —> 属性赋值 —> 初始化 —> 销毁。
  2. 初始化这一步涉及到的步骤比较多,包含 Aware 接口的依赖注入、BeanPostProcessor 在初始化前后的处理以及 InitializingBeaninit-method 的初始化操作。
  3. 销毁这一步会注册相关销毁回调接口,最后通过DisposableBeandestory-method 进行销毁。
    image.png

标签:销毁,Spring,生命周期,接口,---,Bean,调用,方法
From: https://blog.csdn.net/weixin_73205368/article/details/143998239

相关文章

  • python-爬虫入门指南
    前言:由于个人负责的运维组,其中有个同事每回在某个项目发版更新后,需手动在k8s容器平台web界面上复制出几百个微服务的名称以及镜像版本等信息,用来更新微服务清单,个人决定抽时间写个爬虫脚本自动完成手动执行的任务。由于公司信息需保密,这里介绍个简单入门的爬虫脚本做为范例......
  • HarmonyOs DevEco Studio小技巧34--鸿蒙应用架构设计 MVVM模式与三层架构、工程目录迁
    MVVM模式ArkUI采取MVVM=Model+View+ViewModel模式,其中状态管理模块起到的就是ViewModel的作用,将数据与视图绑定在一起,更新数据的时候直接更新视图。在MVVM模式中:Model(模型):model文件夹用于存储数据模型。它表示组件或其他相关业务逻辑之间传输的数据,是对原始数据的......
  • OpenCV-Python 特征匹配
    37.1Brute-Force匹配的基础蛮力匹配器是很简单的。首先在第一幅图像中选取一个关键点然后依次与第二幅图像的每个关键点进行(描述符)距离测试,最后返回距离最近的关键点。对于BF匹配器,我们首先要使用cv2.BFMatcher()创建一个BFMatcher对象。它有两个可选参数。第......
  • SPRINGMVC WEBUPLOADER 分片上传
    前端:vue2,vue3,vue-cli,webuploader,html5后端:SpringBoot数据库:MySQL,Oracle,SQLServer,达梦,人大金仓,国产化数据库协议:HTTPWebServer:Tomcat,Resin服务器:Linux,国产化系统功能:大文件上传,断点续传,秒传,加密传输,加密存储,文件夹上传,文件夹层级结构技术:支持第三方软件集......
  • # 学期(如2024-2025-1) 学号(如:20241402) 《计算机基础与程序设计》第10周学习总结
    学期(如2024-2025-1)学号(如:20241402)《计算机基础与程序设计》第10周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业)这个作业的目标<写上......
  • 请举例说明伪元素 (pseudo-elements) 有哪些用途?
    伪元素在前端开发中用途广泛,以下是一些常见的例子:1.样式化特定内容:::before和::after可以用来插入生成的内容,例如图标、计数器、引号等。.quote::before{content:open-quote;}.quote::after{content:close-quote;}::first-letter可以用来样式化第一......
  • 2024/11/30--阅读笔记|人月神话————画蛇添足
    画蛇添足——蛇本来没有脚,先画成蛇的人,却将蛇添了脚,结果不成为蛇。蛇本来没有脚却被人给它强行加上脚,比喻做事多此一举,反而坏事。我们在成功来临的时候,要保持和巩固现有的成果,不能多次一举,耍小聪明、炫耀自己,否则就会惨败。自作聪明、做多余的事,反而会弄巧成拙,把事情办糟。......
  • Java项目实战II基于SPringBoot的玩具销售商城管理系统(开发文档+数据库+源码)
    目录一、前言二、技术介绍三、系统实现四、核心代码五、源码获取全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末一、前言随着儿童娱乐与教育需求的日益增长,玩具市场呈现出蓬勃......
  • Figma入门-文字、样式、链接、动作
    Figma入门-文字、样式、链接、动作前言在之前的工作中,大家的原型图都是使用Axure制作的,印象中Figma一直是个专业设计软件。最近,很多产品朋友告诉我,很多原型图都开始用Figma制作了,并且很多组件都是内置的,对各种原型图的制作及其友好,只需熟悉一下基本的操作即可上手。......
  • python - 验证身份证合法性
    可以使用id_validator库1.验证身份证号合法性验证身份证号是否合法,合法返回True,不合法返回Falsefromid_validatorimportvalidatorvalidator.is_valid('440308199901101512')#大陆居民身份证18位validator.is_valid('610104620927690')#大陆居民身份证15位......