protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) {
// 1
BeanWrapper instanceWrapper = createBeanInstance(beanName, mbd, args);
final Object bean = instanceWrapper.getWrappedInstance();
if (earlySingletonExposure) {
// 2
addSingletonFactory(beanName, new ObjectFactory() {
@Override
public Object getObject() throws BeansException {
return getEarlyBeanReference(beanName, mbd, bean);
}
});
}
// 3
Object exposedObject = bean;
// 4
populateBean(beanName, mbd, instanceWrapper);
// 5
if (exposedObject != null) {
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
if (earlySingletonExposure) {
// 6
Object earlySingletonReference = getSingleton(beanName, false);
if (earlySingletonReference != null) {
// 7
if (exposedObject == bean) {
exposedObject = earlySingletonReference;
}
else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
// 8
...
}
}
}
return exposedObject;
}
-
1处,创建bean对象,此时,属性什么的全是null,可以理解为,只是new了,field还没设置
-
2处,添加到第三级缓存;加进去的,只是个factory,只有循环依赖的时候,才会发挥作用
-
3处,把原始bean,存到exposedObject
-
4处,填充属性;循环依赖情况下,A/B循环依赖。假设当前为A,那么此时填充A的属性的时候,会去:
new B;
填充B的field,发现field里有一个是A类型,然后就去getBean("A"),然后走到第三级缓存,拿到了A的ObjectFactory,然后调用ObjectFactory,然后调用AOP的后置处理器类:getEarlyBeanReference,拿到代理后的bean(假设此处切面满足,要创建代理);
经过上面的步骤后,B里面,field已经填充ok,其中,且填充的field是代理后的A,这里命名为proxy A。
B 继续其他的后续处理。
B处理完成后,被填充到当前的origin A(原始A)的field中
-
5处,对A进行后置处理,此时调用aop后置处理器的,postProcessAfterInitialization;前面我们说了,此时不会再去调用wrapIfNecessary,所以这里直接返回原始A,即 origin A
-
6处,去缓存里获取A,拿到的A,是proxy A
-
7处,我们梳理下:
exposedObject:origin A
bean:原始A
earlySingletonReference: proxy A
此时,下面这个条件是满足的,所以,exposedObject,最终被替换为proxy A:
if (exposedObject == bean) { exposedObject = earlySingletonReference; }
参考:曹工说Spring Boot源码(29)-- Spring 解决循环依赖为什么使用三级缓存,而不是二级缓存 - 三国梦回 - 博客园
本文深入解析Spring框架中如何通过三级缓存机制解决循环依赖问题,详细介绍了从创建bean实例到填充属性、初始化bean的全过程,并对比了二级缓存的不足之处。

402

被折叠的 条评论
为什么被折叠?



