Spring Bean的生命周期

本文详细介绍了SpringBean的生命周期过程,包括实例化、初始化(涉及属性填充、接口回调和AOP增强)和完成阶段。特别关注了初始化阶段中的属性注入机制和循环引用的处理策略。

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

生命周期的三个阶段(概述)

Spring Bean的生命周期是从Bean实例化之后,即通过反射创建出对象之后,到Bean成为一个完整对象,最终存储到单例池中,这个过程被称为Spring Bean的生命周期。Spring Bean的生命周期大体分为三个阶段:

1.Bean的实例化阶段

Spring框架会取出BeanDefinition的信息进行判断当前Bean的范围是否是singleton的,是否不是延迟加载的,是否不是FactoryBean等,最终将一个普通的singleton的Bean通过反射进行实例化;

2.Bean的初始化阶段(概述文章后面有细讲)

Bean创建之后还仅仅是个"半成品",还需要对Bean实例的属性进行填充、执行一些Aware接口方法、执行BeanPostProcessor方法、执行InitializingBean接口的初始化方法、执行自定义初始化init方法等。该阶段是Spring最具技术含量和复杂度的阶段,AOP增强功能,后面要学的Spring注解功能等等
Spring高频面试题Bean的循环引用问题都是在这个阶段体现

3.Bean的完成阶段

经过初始化阶段,Bean就成为了一个完整的SpringBean,被存储到单例池singletonObjects中去了,即完成了Spring Bean的整个生命周期

Bean的初始化阶段

由于Bean的实例化阶段的步骤比较复杂,所以着重研究Bean的初始化阶段
Spring Bean的初始化过程涉及如下几个过程
1.Bean实例的属性填充
2.Aware接口属性注入
3.BeanPostProcessor的before()方法回调
4.InitializingBean接口的初始化方法回调
5.自定义初始化方法init回调
6.BeanPostProcessor的after()方式回调
PS:通过代码验证上述初始化顺序
1.Bean实例的属性填充
BeanDefinition中对当前Bean实体的注入信息通过属性propertyValues进行存储

BeanDefinition中对当前Bean实体的注入信息通过属性propertyValues进行存储

在这里插入图片描述

Spring在进行属性注入时,会分为如下几种情况:

注入普通属性

注入普通属性。String,int或存储基本类型的集合时,直接通过set方法的反射设置进去;

注入单向对象引用属性

注入单向对象引用属性时。从容器中getBean获取后通过set方法反射设置进去,如果容器中没有,则先创建被注入对象Bean实例(完成整个生命周期)后,在进行注入操作;
例如:
在这里插入图片描述

顺序

在这里插入图片描述

注入双向对象引用属性

注入双向对象引用属性时,就比较复杂了,涉及循环引用(循环依赖)问题,下面会详细阐述解决方案。
多个实体之间相互依赖并形成闭环的情况就叫做“循环依赖”,也叫做“循环引用”

未解决流程(死循环)因为必须加载到单例池中才是一个完成的bean
在这里插入图片描述

在这里插入图片描述

解决方案如下:把半成品bean实例和完成bean实例存储起来(对应上图灰色菱形方块判断)
图片黑马程序员,文章为本人学习笔记

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值