下面这段代码,是通过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)