跟随 @Bean 生命周期源码,探秘 Spring 框架的神秘花园

目录

1. 获取并创建BeanWrapper实例

2. 获取 Bean 实例和类型信息(实例化)

3. 执行合并后的 Bean 定义后置处理器

4. 填充 Bean 属性(属性赋值)和初始化 Bean

4.1 调用 Aware 接口方法

4.2  应用 Bean 初始化前的后置处理器

4.3 调用 Bean 自身的初始化方法

4.4 应用Bean 初始化后的后置处理器

5. 对Bean对象进行使用,执行相关业务逻辑

6. 注册可销毁的 Bean(如果必要)并返回最终的 Bean 实例


Bean 的生命周期是指其在 Spring 容器中从创建到销毁的过程。在 Spring 的源码中,AbstractAutowiredCapableBeanFactory 是用于实现 Bean的自动装配和创建的关键类。它里面的 doCreateBean 方法包含了 Bean生命周期的实现逻辑,源码解释:

1. 获取并创建BeanWrapper实例

首先尝试从缓存(factoryBeanInstanceCache)中获取单例模式下的BeanWrapper实例,如果获取不到(即缓存中不存在或者当前不是单例模式),则通过调用createBeanInstance方法来创建一个新的BeanWrapper实例。BeanWrapper是 Spring 中用于包装 Bean 实例的一个重要接口,它提供了对 Bean 实例的属性访问等功能。

2. 获取 Bean 实例和类型信息(实例化)

instanceWrapper中获取被包装的实际 Bean 实例以及对应的类型信息。如果获取到的类型不是NullBean.class(表示不是一个空的占位类型),则将该类型信息设置到RootBeanDefinitionmbd)的resolvedTargetType属性中,以便后续使用。

3. 执行合并后的 Bean 定义后置处理器

使用同步块来确保在多线程环境下对mbd的后置处理操作的一致性。如果当前BeanDefinition还没有经过后置处理(mbd.postProcessedfalse),则调用applyMergedBeanDefinitionPostProcessors方法来应用合并后的 Bean 定义后置处理器。

后置处理器可以对 Bean 定义进行进一步的修改、增强等操作

....忽略

4. 填充 Bean 属性(属性赋值)和初始化 Bean

首先将初始的 Bean 实例赋值给exposedObject。然后通过populateBean方法来填充 Bean 的属性,比如通过注入依赖等方式设置 Bean 的各个属性值。接着调用initializeBean方法对 Bean 进行初始化操作,这可能包括调用Beaninit方法等初始化逻辑。

接下来看看具体的initializeBean方法

4.1 调用 Aware 接口方法

让 Bean 获取到一些关于自身或容器的相关信息:

4.2  应用 Bean 初始化前的后置处理器

调用applyBeanPostProcessorsBeforeInitialization方法来应用一系列在 Bean 初始化之前需要执行的后置处理器。这些后置处理器可以对 Bean 实例进行一些前置处理,比如修改 Bean 的属性、添加额外的行为等

4.3 调用 Bean 自身的初始化方法

尝试调用 Bean 自身的初始化方法:

继续查看invokeInitMethods方法:

 这个方法通常用于在 Bean 的属性设置完成后进行一些额外的初始化操作,比如初始化一些依赖的资源等。

4.4 应用Bean 初始化后的后置处理器

就会调用applyBeanPostProcessorsAfterInitialization方法来应用一系列在 Bean 初始化之后需要执行的后置处理器。这些后置处理器可以对已经完成初始化的 Bean 实例进行进一步的后置处理,比如添加一些额外的监控逻辑、记录初始化完成后的状态等

5. 对Bean对象进行使用,执行相关业务逻辑

......

6. 注册可销毁的 Bean(如果必要)并返回最终的 Bean 实例

最后,通过registerDisposableBeanIfNecessary方法注册可销毁的 Bean。如果注册成功,则返回经过上述一系列处理后的最终的exposedObject,这个对象就是可以在应用中正常使用的完整处理后的 Bean 实例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敖云岚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值