相应源码位置:AbstractAutowireCapableBeanFactory.class
// Eagerly cache singletons to be able to resolve circular references
// even when triggered by lifecycle interfaces like BeanFactoryAware.
boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
isSingletonCurrentlyInCreation(beanName));
if (earlySingletonExposure) {
//是否提前暴露
if (logger.isTraceEnabled()) {
logger.trace("Eagerly caching bean '" + beanName +
"' to allow for resolving potential circular references");
}
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
//创建objectfactory用于获取对应的bean(通过objectfactory.getObject()),但是此处只是创建objectfactory,并没有调用,当调用到此objectfactory的时候,通过getObject获得的此时的bean还未完成初始化,即是一个earlybean,还未成为一个真正的bean(另外,此处若是有aop,则getObject()会提前获得到对应的代理对象,一样的,此处的代理对象也未填充,之后会对包裹的原始对象进行填充)
}
// Initialize the bean instance.
Object exposedObject = bean;
try {
populateBean(beanName, mbd, instanceWrapper);
//填充装配
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
在没有循环依赖的情况下,lambda生成的objectfactory并不会被使用 到
wrapIfNecessary(bean, beanName, cacheKey);//实现aop
个人理解:循环依赖中设计到三个缓存
第一个是存放完整的bean
第二个是存放不完整的bean,主要是用到其中的引用。
第三个是放生成bean的工厂,如果不存在循环引用,这个里面存放的工厂将不会被调用到
第三个缓存的作用主要是判断是否返回原始bean引用还是bean的代理类的引用,如果spring没有aop的概念,第三个缓存理论上可以不用【指的是可以不设计第三个缓存】。但是不管有没有循环依赖,spring都会往里面放一个,只要满足earlySingletonExposure==true。但是后面用不用就不一定了,有循环依赖才会用到,然后有aop才会涉及到AbstractAutoProxyCreator,才会把原生bean的引用变成代理引用【引用是指存的只是个地址值】
猜测:spring循环依赖的设计只是先暴露引用,但是可能这个引用是个代理,则需要暴露代理引用,但是设计上,在提前暴露引用的时候是不实现代理的【具体内容后面再做】,后面还需要经历一系列bean的生命周期(比如初始化前后增加的beanPostProcessor),这里只是其中的一个周期----InstantiationAwareBeanPostProcessor(AbstractAutoProxyCreator implements SmartInstantiationAwareBeanPostProcessor; SmartInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessor)
Instantiation-----实例化