spring循环依赖源码分析

以下讲的循环依赖时基于单例模式下的@Autowired或者set方法的spring的循环依赖

spring循环依赖 搞懂之前需要了解bean的创建过程

大概步骤如下:

1、org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(String, Class<T>, Object[], boolean) 创建bean的方法

2、org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(String)

单例池中获取bean对象,第一次创建bean的时候肯定返回空 

循环依赖发生时 进入该方法时候会从三级缓存singletonFactories中执行lambda表达式 生成代理对象,并且放置到二级缓存中 

该方法里面个set集合 singletonsCurrentlyInCreation注意下面会设置值

protected Object getSingleton(String beanName, boolean allowEarlyReference) {
		Object singletonObject = this.singletonObjects.get(beanName);//从一级缓存中获取
		if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
//isSingletonCurrentlyInCreation 是从一个set中获取 意思是正在创建的对象  当你bean开始创建的时候就会设置进入这个set
			synchronized (this.singletonObjects) {
				singletonObject = this.earlySingletonObjects.get(beanName);
				if (singletonObject == null && allowEarlyReference) {
					ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
					if (singletonFactory != null) {
						singletonObject = singletonFactory.getObject();//执行lambda表达式 提前aop
						this.earlySingletonObjects.put(beanName, singletonObject);//放入二级缓存
						this.singletonFactories.remove(beanName);//从三级缓存中移除
					}
				}
			}
		}
		return singletonObject;
	}

3、org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(String, ObjectFactory<?>) 这个方法第二个参数是个lambda表达式 只有真正调用getObject时候才会执行

注意此getSingleton 并非步骤2中的getSingleton 参数不一样

  这个方法里面会做如下几件事情:

  3.1.、beforeSingletonCreation  也就是会往singletonsCurrentlyInCreation这个set中放入该bean,代表bean正在创建中 

  3.2、 singletonFactory.getObject 真正执行lambda表达式 也就是执行下面这个方法 org.springframework.beans.factory.support.AbstractBeanFactory.createBean(String, RootBeanDefinition, Object[]) 

   实现类在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(String, RootBeanDefinition, Object[])

真正实现bean的生命周期的方法是

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(String, RootBeanDefinition, Object[])

    3.2.1 、createBeanInstance 推断构造方法 实例化

    3.2.2、addSingletonFactory 将该bean设置到三级缓存singletonFactories中去  

    3.2.3、populateBean 属性填充  当通过@Autowired或者set方法注入的时候 会在这个步骤里面填充属性 并且发现循环引用 重新调用步骤2

    3.2.4、initializeBean 初始化bean

举例说明 如下代码块 A→B   B→A  发生了循环引用

@Component
public class A {
	@Autowired
	B b;
}

@Component
public class B {
	@Autowired
	A a;
}

子方法操作三级缓存内容
doGetBeangetSingleton(String)第一次来单例池找a  但找不到

singletonFactories:无

earlySingletonObjects:无

singletonObjects:无

createBeanInstance实例化a

singletonFactories:无

earlySingletonObjects:无

singletonObjects:无

addSingletonFactorya放入三级缓存

singletonFactories:a

earlySingletonObjects:无

singletonObjects:无

populateBeanpostProcessProperties填充属性 发现b

singletonFactories:a

earlySingletonObjects:无

singletonObjects:无

inject注入属性b
doResolveDependency处理依赖
4.3 resolveCandidate等待getBean(b)的返回
beanFactory.getBeanget b的bean又回到第一步
doGetBeangetSingleton(String)获取b的bean 还是拿不到

singletonFactories:a

earlySingletonObjects:无

singletonObjects:无

createBeanInstance实例化b

singletonFactories:a

earlySingletonObjects:无

singletonObjects:无

addSingletonFactoryb放入三级缓存

singletonFactories:a、b

earlySingletonObjects:无

singletonObjects:无

populateBeanpostProcessProperties填充属性 发现a

singletonFactories:a、b

earlySingletonObjects:无

singletonObjects:无

inject注入属性a
doResolveDependency处理依赖
8.3resolveCandidate等待getBean(a)的返回
beanFactory.getBeanget a的bean又回到第一步
doGetBeangetSingleton(String)第二次来单例池找a  找到了并且执行getObject 提前aop了

singletonFactories:b

earlySingletonObjects:a

singletonObjects:无

返回8.3resolveCandidate 8.3方法resolveCandidate  获取到了返回的bean a  填充了 a属性 继续初始化b

singletonFactories:b

earlySingletonObjects:a

singletonObjects:无

initializeBean继续初始化b 

singletonFactories:b

earlySingletonObjects:a

singletonObjects:无

getSingleton(String beanName, ObjectFactory<?> singletonFactory)addSingleton(String beanName, Object singletonObject)b初始化完成之后 添加到一级缓存  删除二级三级缓存

singletonFactories:无

earlySingletonObjects:a

singletonObjects:b

返回4.3resolveCandidate 返回完整的b对象给 给a来填充属性 

singletonFactories:无

earlySingletonObjects:a

singletonObjects:b

initializeBean初始化a

singletonFactories:无

earlySingletonObjects:a

singletonObjects:b

getSingleton(String beanName, ObjectFactory<?> singletonFactory)addSingleton(String beanName, Object singletonObject)a初始化完成之后 添加到一级缓存 删除二级三级缓存

singletonFactories:无

earlySingletonObjects:无

singletonObjects:b、a

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值