当前位置: 首页 > news >正文

Spring Bean的生命周期

文章目录

  • Spring Bean的生命周期
    • 加载Bean对象
    • 创建Bean对象
      • 构造对象
      • 填充属性
      • 初始化实例
      • 注册销毁
    • 销毁

Spring Bean的生命周期

Spring Bean的生命周期就是指Bean对象从创建到销毁的过程,大体可以分为:实例化、属性赋值、初始化、使用、销毁。

在这里插入图片描述

加载Bean对象

在程序员启动Spring程序后就开始准备创建Bean对象。通过“加载Bean定义”LoadBeanDefinition方法,用“xml,注解扫描”等各种方式,找到程序中定义的Bean,并放入到容器中的一个“Bean定义集合”BeanDefinitionMap中,有了这些BeanDefinitionMap“Bean定义的集合”之后,容器就可以遍历这个集合,通过creatBean方法创建每一个Bean对象。
在这里插入图片描述

创建对象可以分为四个步骤:①构造对象;②填充属性;③初始化实例;④注册销毁

创建Bean对象

构造对象

通过createBeanInstance方法进行对象的构造,先用反射机制从BeanDefinition(“Bean定义”)中的BeanClass拿到这个类的构造方法。在获取这个类的构造方法时,如果这个类中只有一个构造方法,无论该方法有没有参数都获取该构造方法;如果这个类有多个构造方法时就会优先获取加有@Autowired的构造方法,如果有多个构造方法加有@Autowired注解则会报错;如果构造方法都没有使用@Autowired注解,就会优先获取到无参构造;如果多个方法都是有参构造,则会报错。在选择了构造方法之后,就会准备构造方法需要的参数,会在单例池中根据参数class类进行查找,如果根据类没有找到,就会根据参数名继续查找,如果没有找到就会报错。在准备好参数之后就可以通过反射进行Bean的构造了,也就是实例化;如果是无参构造无需准备参数直接构造。

在这里插入图片描述

填充属性

通过populateBean方法为Bean内部所需的属性进行赋值填充,通常就是带有@Autowired的属性。容器会通过三级缓存机制进行填充,也就是依赖注入。

在这里插入图片描述

初始化实例

在这里插入图片描述

在填充完属性后紧接着就要通过initializeBean方法,对这个实例进行初始化。初始化的第一步是初始化容器相关信息,通过invokeAwareMethods方法为实现了Aware接口的Bean设置例如beanName ,beanFactory等容器信息,Aware的接口代表“信息感知”接口,一旦实现了这些接口,就可以在bean实例中感知并获取对应的信息。

接下来通过invokeinitMethods方法执行Bean的初始化方法。这个初始化方法是通过实现InitializingBean接口而实现的afterPropertiesSet方法,在afterPropertiesSet执行之后,还会继续执行Bean中自定义的initMethod方法,在执行初始化方法之前和之后,还需要对applyBeanPostProcessorsBeforeInitialization和applyBeanPostProcessorsAfternitialization分别在初始化之前和之后处理各种Bean的后置处理器,这些后置处理器包括容器自身提供的AOP。

注册销毁

上面步骤完成是Bean实例已经可以使用了,为了刚好的销毁,通过注册销毁registerDisposableBean方法,将实现了销毁接口DisposableBean的bean进行注册,这样销毁时就可以执行destroy方法。

通过以上四小步我们就已经将bean创建好了,最后只需要将这些完整的Bean对象通过addSingleton方法,放入到单例池singletonObjects就可以被获取和使用了。

在这里插入图片描述

销毁

在销毁之前先执行“销毁前置处理器”postProcessBeforeDestruction这里就会执行Bean中@preDestroy注解方法然后通过destroyBeans方法逐一销毁容器的Bean,销毁时会执行destroy犯法,也会通过“客户销毁方法”invokeCustomDestoryMethod“来执行Bean上自定义的destroyMethod方法。

在这里插入图片描述

原视频:https://www.bilibili.com/video/BV1584y1r7n6/?spm_id_from=333.999.0.0&vd_source=244586bf9c5b71d8a3ca8b190a5a0942

http://www.lryc.cn/news/108735.html

相关文章:

  • 基于量子同态的安全多方量子求和加密
  • 前端自动化测试:确保质量和稳定性的关键步骤
  • 《Ansible自动化工具篇:Centos操作系统基于ansible工具一键远程离线部署之K8S1.24.12二进制版集群》
  • Java实现十大经典排序算法之快速排序
  • 【0803作业】创建两个线程:其中一个线程拷贝图片的前半部分,另一个线程拷贝后半部分(4种方法)
  • php运算符的短路特性
  • C语言假期作业 DAY 13
  • 以产品经理的角度去讲解原型图---会议OA项目
  • C++ 外部变量和外部函数
  • C# Onnx Paddle模型 OCR识别服务
  • MCUXpresso for VS Code -- 基于VSCode开发RT1176
  • MySQL的使用——【初识MySQL】第二节
  • MySQL最终弹-并发(脏读,不可重复读,幻读及区别),JDBC的使用和安装,最全万字
  • ⌈C++⌋从无到有了解并掌握C++面向对象三大特性——封装、继承、多态
  • Element的el-select下拉框多选添加全选功能
  • python调用pytorch的clip模型时报错
  • MySQL 数据库 binLog 日志的使用
  • Apache Storm入门介绍之三分钟看懂Apache Storm
  • RF手机天线仿真介绍(三):调谐开关分析
  • Ubuntu20.04 + QT5.14.2 + VTK8.2.0 + PCL 1.10 环境配置
  • GPT Prompt编写的艺术:如何提高AI模型的表现力
  • Ubuntu18.04 安装opencv 4.8.0教程(亲测可用)
  • 【腾讯云Cloud Studio实战训练营】React 快速构建点餐页面
  • 自监督去噪:Noise2Self原理分析及实现 (Pytorch)
  • docker容器学习笔记1
  • 线程魔法:用Spring Boot的@Async注解开启异步世界
  • 面试热题(接雨水问题)
  • Meta AI研究团队新AI模型: Llama 2 大语言模型
  • CSS水平垂直居中
  • Yolov8-pose关键点检测:模型部署篇 | yolov8-pose.onnx python推理