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
相关文章:
Spring Bean的生命周期
文章目录 Spring Bean的生命周期加载Bean对象创建Bean对象构造对象填充属性初始化实例注册销毁 销毁 Spring Bean的生命周期 Spring Bean的生命周期就是指Bean对象从创建到销毁的过程,大体可以分为:实例化、属性赋值、初始化、使用、销毁。 加载Bean对象…...
基于量子同态的安全多方量子求和加密
摘要安全多方计算在经典密码学中一直扮演着重要的角色。量子同态加密(QHE)可以在不解密的情况下对加密数据进行计算。目前,大多数协议使用半诚实的第三方(TP)来保护参与者的秘密。我们使用量子同态加密方案代替TP来保护各方的隐私。在量子同态加密的基础上ÿ…...
前端自动化测试:确保质量和稳定性的关键步骤
文章目录 测试金字塔与前端测试层级1. 单元测试(Unit Testing)2. 组件测试(Component Testing)3. 集成测试(Integration Testing)4. 端到端测试(End-to-End Testing) 单元测试、集成…...
《Ansible自动化工具篇:Centos操作系统基于ansible工具一键远程离线部署之K8S1.24.12二进制版集群》
一、部署背景 由于业务系统的特殊性,我们需要针对不同的客户环境部署二进制版K8S集群,由于大都数用户都是专网环境,无法使用外网,为了更便捷,高效的部署,针对业务系统的特性,我这边编写了 基于a…...
Java实现十大经典排序算法之快速排序
0 算法简介 快速排序是一种高效率排序算法,它是对冒泡排序的一种改进,它也是一种不稳定排序算法。快速排序的核心是比较、交换和递归。 在待排序数组中指定一个基准元素pivot(一般选取数组首元素),使得数组排序之后基…...
【0803作业】创建两个线程:其中一个线程拷贝图片的前半部分,另一个线程拷贝后半部分(4种方法)
方法一:使用pthread_create、pthread_exit、pthread_join函数【两个线程不共用同一份资源】 先在主函数创建并清空拷贝的目标文件,再创建两个线程,在两个线程内部同时打开要读取的文件以及要拷贝的目标文件(两个线程不共用同一份资…...
php运算符的短路特性
php运算符的短路特性 1、逻辑运算符:逻辑与(&&)和逻辑或(||),存在着短路特性 PHP中有以下两个运算符具有短路的特性,他们是逻辑运算符的逻辑与(&&)和逻辑或(||&am…...
C语言假期作业 DAY 13
一、选择题 1、如果 x2014 ,下面函数的返回值是( ) int fun(unsigned int x) { int n 0; while(x 1) { n; x x | (x 1); } return n; } A: 20 B: 21 C: 23 D 25 答案解析 正确答案:C 这个作用是对整型中0的个数进行统计&…...
以产品经理的角度去讲解原型图---会议OA项目
目录 一.前言 二.原型图 2.1 原型图是什么 3.1 原型图的作用 三.演示讲解 3.1 项目背景 3.2 项目介绍 3.2.1 会议管理(会议的发起,通知) 3.2.2 投票管理(会议的流程重大决策记录) 3.2.3 会议室管理 3.2.4 系统管…...
C++ 外部变量和外部函数
1.外部变量 如果一个变量除了在定义它的源文件中可以使用外,还能被其他文件使用,那么就称这个变量为外部变量。命名空间作用域中定义的变量,默认情况下都是外部变量,但在其他文件中如果需要使用这一变量,需要用extern…...
C# Onnx Paddle模型 OCR识别服务
效果 项目 可运行程序exe下载 Demo(完整源码)下载...
MCUXpresso for VS Code -- 基于VSCode开发RT1176
MCUXpresso for VS Code 是nxp推出插件,旗下MCX LPC, Kinetis和i.MX rt等MCU,都能在VS Code平台进行嵌入式开发。功能框图如下: 前期准备: 软件环境: windows(实际可以跨系统,linux和mac没有测试) VS Code ninja CMa…...
MySQL的使用——【初识MySQL】第二节
MySQL的使用——【初识MySQL】第二节 文章目录 MySQL环境变量的配置(如使用Navicat可忽略)使用命令行连接MySQL(如使用Navicat可忽略)步骤注意 NavicatNavicat的下载Navicat的使用连接MySQL新建表 总结总结 MySQL环境变量的配置&a…...
MySQL最终弹-并发(脏读,不可重复读,幻读及区别),JDBC的使用和安装,最全万字
一、💛并发基本概念 并发的基本意思: 什么是并发呢?简单的理解就是同一时间执行 服务器同一时刻,给多个客户端提供服务~~,这两个客户端都可以给服务器提交事务。 如果提交两个事务,改…...
⌈C++⌋从无到有了解并掌握C++面向对象三大特性——封装、继承、多态
前置知识:类和对象 参考书籍:《C Primer 第五版》 目录 什么是面向过程?什么是面向对象? 一、封装 1、封装的含义以及如何实现封装 1.1 访问限定符(访问说明符) 1.2 什么是封装? 2、封装的优点…...
Element的el-select下拉框多选添加全选功能
先看效果图 全选: 没有选中时: 选中部分: 作者项目使用的是vue3写法,如果是vue2的自己转换一下 html代码: js代码: 拓展 另一种方法,如果不想使用勾选框,可以试试下面的方…...
python调用pytorch的clip模型时报错
使用python调用pytorch中的clip模型时报错:AttributeError: partially initialized module ‘clip’ has no attribute ‘load’ (most likely due to a circular import) 目录 现象解决方案一、查看项目中是否有为clip名的文件二、查看clip是否安装成功 现象 clip…...
MySQL 数据库 binLog 日志的使用
一、概念与作用 binlog(二进制日志)是MySQL数据库中的一种日志类型。它记录了数据库中的所有更改操作,例如插入、更新、删除操作。binlog以二进制形式存储,因此可以更高效地进行读取和解析。 binlog通常用于以下几个方面&#x…...
Apache Storm入门介绍之三分钟看懂Apache Storm
文章目录 0.前言1. 什么是 Apache Storm?1.1. Nimbus1.2. Zookeeper1.3. Supervisor1.4. Worker1.5 集群模式下各组件职责 2. 核心概念2.1基本架构和任务模型2.2 工作流程 3. 源码地址3.1. 代码结构3.1. 核心模块介绍 4. Storm入门实例0.创建java工程并引入依赖1. 创…...
RF手机天线仿真介绍(三):调谐开关分析
目录 简介调谐开关RON、COFF的影响分析不同位置的调谐器件coff影响分析不同位置的调谐器件Ron影响分析Coff引起谐振的解决示例 调谐开关VPEAK分析调谐开关Vpeak示例 简介 孔径调谐能调节天线的电长度,可将其谐振点切换到所需支持的工作频段。天线孔径调谐器通过改变…...
抖音下载器技术方案:双引擎策略架构与高效内容获取系统
抖音下载器技术方案:双引擎策略架构与高效内容获取系统 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback supp…...
从极简设计到高效标注:gInk屏幕标注工具的技术解析与实践指南
从极简设计到高效标注:gInk屏幕标注工具的技术解析与实践指南 【免费下载链接】gInk An easy to use on-screen annotation software inspired by Epic Pen. 项目地址: https://gitcode.com/gh_mirrors/gi/gInk gInk是一款面向Windows平台的轻量级屏幕标注工…...
Qwen3.5-4B-Claude-Opus商业应用:SaaS产品嵌入式AI助手轻量级方案
Qwen3.5-4B-Claude-Opus商业应用:SaaS产品嵌入式AI助手轻量级方案 1. 产品概述 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF是一款专为商业场景优化的轻量级AI推理模型,基于Qwen3.5-4B架构进行深度蒸馏优化,特别强化了结构化分析…...
BetterGI原神智能辅助工具完全指南:从安装到精通
BetterGI原神智能辅助工具完全指南:从安装到精通 【免费下载链接】better-genshin-impact 📦BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一条龙 | 全连音游 - UI Aut…...
深度解析部署包校验:OpenClaw哈希特征提取与比对实操手册
在技术领域,我们常常被那些闪耀的、可见的成果所吸引。今天,这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力,让我们得以一窥未来的轮廓。然而,作为在企业一线构建、部署和维护复杂系统的实践者,我们深知…...
乙巳马年春联生成终端Matlab仿真应用:传统文化与计算科学的结合
乙巳马年春联生成终端Matlab仿真应用:传统文化与计算科学的结合 春节贴春联,是传承千年的文化习俗。一副好的春联,既要对仗工整、平仄协调,又要蕴含美好的寓意。如今,随着人工智能技术的发展,我们有了新的…...
加密货币钱包原理与开发
加密货币钱包原理与开发:数字资产的安全之门 在区块链技术蓬勃发展的今天,加密货币钱包作为管理数字资产的核心工具,已成为用户进入加密世界的必备钥匙。无论是比特币、以太坊还是其他代币,钱包不仅存储密钥,更是实现…...
NeurIPS 2024新作SOFTS实战:用PyTorch复现这个高效的多元时间序列预测模型
NeurIPS 2024新作SOFTS实战:用PyTorch复现高效的多元时间序列预测模型 多元时间序列预测在能源管理、交通流量分析和金融市场预测等领域具有广泛应用。2024年NeurIPS会议上提出的SOFTS模型,通过创新的Series-cOre Fusion机制,在预测精度和计算…...
基于MATLAB的GNSS软件接收机跟踪环路详解——自学笔记(3)
1. GNSS软件接收机跟踪环路核心原理 当你第一次打开MATLAB的GNSS软件接收机跟踪函数时,可能会被满屏的变量和运算吓到。别担心,跟踪环路本质上就是个"数字锁匠"——它的任务就是紧紧咬住卫星信号不放。想象一下老式收音机调频,你需…...
龙芯k - 走马观碑组ST驱动移植柏
正文 异步/等待解决了什么问题? 在传统同步I/O操作中(如文件读取或Web API调用),调用线程会被阻塞直到操作完成。这在UI应用中会导致界面冻结,在服务器应用中则造成线程资源的浪费。async/await通过非阻塞的异步操作解…...
