Spring Bean实例创建装载过程分析-spring源码学习(2)

news/2024/7/24 10:39:32 标签: spring, 学习, java

随着Spring框架的应用越来越广泛,对Spring Bean的实例创建装载过程的了解就显得尤为重要。本文将围绕这一主题,为大家详细介绍Spring Bean实例创建装载的整个过程,并透彻解析其细节。

时序图

 

一、Spring Bean实例的创建过程

Spring Bean实例的创建过程可以分为以下几个步骤:

1.配置文件的解析和读取 

在Spring中,Bean的定义主要依赖于配置文件的定义,并且Spring支持各种类型的配置文件,如XML、Java配置、注解等,在配置文件解析和读取环节中,Spring会根据Bean定义中的相关信息(包括Bean类名、属性值等)去查找对应的Bean定义并将其解析出来。

2.实例化Bean对象

接下来,Spring会根据Bean定义中所指定的Bean类名(或接口名)以及配置文件中的定义信息(如构造函数或工厂方法)来创建Bean实例。

3.设置Bean属性值 

一旦Bean对象被实例化,Spring会为其设置相关的属性值,这些属性值是从配置文件中读取的数据,Spring将这些数据注入到具体的Bean实例中。

4.调用Bean的初始化方法

在实例化和属性设置完成之后,Spring会自动调用Bean的初始化方法,这个方法可以是自定义的,也可以是Bean类中定义的默认初始化方法,这个方法主要用于完成Bean实例的初始化工作。

二、 Spring Bean的装载过程

通过上述过程,我们已经了解了Spring Bean的实例创建过程,接下来我们将继续深入了解Spring Bean的装载过程,具体包括以下几个阶段:

1. Bean的定义阶段

定义阶段主要涉及Bean定义的加载和解析,这一过程的核心是将Bean定义的描述信息映射至BeanDefinition对象中,以便后续的Bean实例化操作使用。

2. Bean的注册阶段

在定义阶段完成之后,Spring需要将这些BeanDefinition对象注册到BeanFactory中,这一阶段的核心是将BeanDefinition对象缓存到内存中供后续的Bean实例化使用。

3. Bean的实例化阶段

该阶段是Spring Bean装载的核心阶段,其核心任务是根据BeanDefinition对象创建对应的Bean实例,并将这些实例缓存到内存中供后续的使用。

4. Bean的依赖注入阶段

该阶段是根据Spring IoC容器中定义的Bean之间的依赖关系,将依赖的Bean注入到对应的Bean中,并保存到Spring容器的单例池中以供后续使用。

5. Bean的初始化阶段

该阶段是在实例化和属性注入完成之后,Spring会自动调用Bean的初始化方法,这个方法可以是自定义的,也可以是Bean类中定义的默认初始化方法,这个方法主要用于完成Bean实例的初始化工作。

6. Bean的销毁阶段

该阶段是在Spring容器关闭时,调用单例Bean的销毁方法以释放占用的资源,从而保证应用程序正常退出。

三、结语

通过上述的分析,我们可以看到Spring Bean实例创建装载过程是一个复杂的过程,其中包含多个阶段和细节,这也表明Spring框架的强大之处正是在于这种复杂的Bean实例化和装载机制。如果我们能够了解并熟练地运用Spring Bean实例创建装载的整个过程,相信对于我们开发高质量的应用程序将会大有益处。


http://www.niftyadmin.cn/n/132499.html

相关文章

LeetCode 热题 C++ 538. 把二叉搜索树转换为累加树 543. 二叉树的直径 560. 和为 K 的子数组

538. 把二叉搜索树转换为累加树 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下,二…

Codeforces Round 703 (Div. 2)(A~D)

A. Shifting Stacks给出一个数组,每次可以将一个位置-1,右侧相邻位置1,判断是否可以经过若干次操作后使得数列严格递增。思路:对于每个位置,前缀和必须都大于该位置应该有的最少数字,即第一个位置最少是0&a…

深入浅出PaddlePaddle函数——paddle.zeros_like

分类目录:《深入浅出PaddlePaddle函数》总目录 相关文章: 深入浅出PaddlePaddle函数——paddle.Tensor 深入浅出PaddlePaddle函数——paddle.ones 深入浅出PaddlePaddle函数——paddle.zeros 深入浅出PaddlePaddle函数——paddle.full 深入浅出Padd…

【ROS学习笔记13】ROS中的TF坐标变换

【ROS学习笔记13】ROS中的TF坐标变换 文章目录【ROS学习笔记13】ROS中的TF坐标变换前言1. 静态坐标变换2. 动态坐标变换3. 多坐标变换4. 坐标系关系查看5. TF坐标变换实操Reference写在前面,本系列笔记参考的是AutoLabor的教程,具体项目地址在 这里 前言…

C++ | 详细介绍缺省参数的作用

文章目录一、前言1、缺省参数概念2、缺省参数的使用规则二、全缺省参数【备胎是如何使用的♿】1、四种实参传递方式说明2、疑难细究三、半缺省参数【⭐】1、错误用法示范2、正确用法示范🔥实参缺省与形参缺省的混合辨析🔥3、小结四、缺省参数的实际应用 …

ubus编译_环境搭建

文章目录一、环境搭建脚本toolChain_jsonc.cmaketoolChain_libubox.cmaketoolChain_ubus.cmakeinstall.sh二、测试出现问题:三、测试uloopmain.c 每5s打印信息一、环境搭建脚本 准备四个文件 install.sh,toolChain_jsonc.cmake,toolChain_libubox.cmake,toolChai…

如何用 23 种编程语言说“Hello World”

在编程的世界里," Hello World " 往往是开发者开始学习一种新语言时写的第一个程序。这个简单的程序会将 “Hello World“ 输出在我们的屏幕上。看似很简单的行为,实际上对于每一个新学习编程语言的人来说,它代表着新的起点。那么&…

Kafka 位移主题

Kafka 位移主题位移格式创建位移提交位移删除位移Kafka 的内部主题 (Internal Topic) : __consumer_offsets (位移主题,Offsets Topic) 老 Consumer 会将位移消息提交到 ZK 中保存 当 Consumer 重启后,能自动从 ZK 中读取位移数据,继续消费…