afterProperties 与 beans 实例化顺序的问题研究

本文探讨了Spring框架中afterPropertiesSet方法与Bean实例化顺序的关系。通过分析,揭示了即使ZooService先于其依赖的Animal实现类初始化,ApplicationContext也能确保在调用afterPropertiesSet时,所有依赖的Bean均已完全初始化,避免了获取实现类失败的问题。

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

afterProperties 与 beans 实例化顺序的问题研究


背景:

现在需要在某个 ZooService 中获取环境上下文 ApplicationContext ,然后在 afterPropertiesSet 中用 ApplicationContext 获取某个接口 Animal 的所有实现类(Tiger、Lion、…)并保存到 ZooService 中的成员变量 animals 中。

疑惑:

根据网上资料显示,afterPropertiesSet 会在一个 bean 初始化完成后调用。会不会存在一种情况,就是 ZooService 完成初始化,而 Animal 的实现类还没有完成初始化,此时触发 ZooService 的 afterPropertiesSet 方法,用 ApplicationContext 获取某个接口 Animal 的所有实现类,会出现部分 Animal 实现类(如Tiger)还没初始化的情况 ,甚至有可能所有 Animal 的实现类都获取不到。

探究:

搞清楚 afterpropertiesset 是不是在容器所有 bean 都初始化完毕才进行

结论:

afterPropertiesSet 并不是在所有 bean 初始化完成后才进行,它在当前 bean 实例化并注入好依赖后即执行。
但我们依然能达到期望的结果,跟进 applicationContext.getBeansOfType() 源码一探,发现它的执行逻辑如下:
1、从 beanDefinitions 中获取符合 type 类型的所有 beanName
2、循环1得到的 beanNames,逐个调用他们的 getBean 方法

由上可知,就算案例中我们的 ZooService 先初始化,而此时 Tiger 类还没初始化,在调用 getBeansOfType 方法时也会把指定 type 的未实例化的 bean 都实例化一遍,那么也就不存在我们担心的上下文获取实现类失败的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值