beforeSingletonCreation方法作用

下面这段代码,是通过beanName获取bean实例的大体流程。
在这里插入图片描述
在看下getSingleton获取单例对象方法,它获取的时候回判断是否beanName存在循环引用。
在这里插入图片描述
singletonObjects:缓存完整对象 bean name -》 bean instance
singletonFactories:缓存工厂bean,ObjectFactory beanname -》ObjectFactory
earlySingletonObject:缓存bean实例,可能是没完全创建好的实例。目的是用来检测循环引用。

昨天看到beforeSingletonCreation这个方法一直没搞懂有啥用,今天梳理下吧。
先看下代码,这一块是工厂bean获取bean实例的流程:
在这里插入图片描述
首先说下这个shouldPostProcess变量,如果true则是用户自己定义的bean,false是系统的。我们可以在这个bean实例化后做处理,可以看到postProcessObjectFromFactoryBean就是用来执行用户自定义动作的。
步骤1,是先从缓存中通过beanName去取bean的实例
步骤2,如果没有取到对象,那么就会执行真正的创建对象方法,调用了FactoryBean接口里的getObject方法。
beforeSingletonCreation这个方法呢,是为了便于对循环依赖进行检测的,可能由于创建的时候没有暴露出来对象。

在这里插入图片描述
在这里插入图片描述
inCreationCheckExclusions是个线程安全的set。
可以看下面这一片文章。
https://www.jianshu.com/p/f25d9d7fdaf3

解决循环依赖
举栗:AB循环依赖,A中含有B属性,B中含有A属性。
过程:创建A对象->开始创建bean(记录beanNameA)->暴露ObjectFacotry->populateBean(填充属性)->开始创建bean(记录beanNameB)->暴露ObjectFacotry->populateBean(填充属性)->getBean(A)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值