Spring循环依赖源码剖析

Spring循环依赖源码剖析


一、场景介绍

在这里插入图片描述

二、整理执行流程总结

在这里插入图片描述
在这里插入图片描述

三、源码分析

  1. 编写测试类
    	/**
    	 * 测试循环依赖
    	 */
    	@Test
    	public void testCyclicDependence(){
    		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext-cyclicDependence.xml");
    		ABean aBean = applicationContext.getBean(ABean.class);
    		aBean.print();
    	}
    
  2. 在类Spring容器DefaultListableBeanFactory类中定位到方法preInstantiateSingletons(),设置断点(此方法进行Bean的实例化操作)
    在这里插入图片描述
  3. 在此方法中,定位到实例化Bean的核心方法getBean(beanName),设置断点,进行跳转,并进入此方法中
    在这里插入图片描述
  4. 定位到getSingleton(beanName)方法,并断点进入此方法

在这里插入图片描述

  1. 从一级缓存中获取BeanA,获取不到
    在这里插入图片描述

  2. 将断点设置到类AbstractBeanFactory中,定位到创建单例bean的方法getSingleton(),进入此方法
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

getSingleton()方法最终执行createBean方法,进行bean的创建,因此继续进入此方法
在这里插入图片描述

  1. 定位到doCreateBean方法,并进入
    在这里插入图片描述
    实例化BeanA
    在这里插入图片描述
    继续向下执行,加入到spring的三级缓存,是一个工厂
    在这里插入图片描述
    将BeanA的工厂对象存储到三级缓存
    在这里插入图片描述

BeanA属性填充
在这里插入图片描述

在这里插入图片描述
BeanA属性填充BeanB
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

此处流程和创建BeanA的流程一致
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

总结:

二级缓存:复用(如果BeanA中有多个属性bean都依赖BeanB,此时就可以直接从二级缓存中取即可)
三级缓存:AOP增强
对象单一原则:不建议在一个集合中存储两种状态的对象,一级缓存存储走完spring生命周期的bean,二级缓存存储未走完的对象,三级缓存存储bean的工厂对象,并且可以生产通过AOP增强的对象

BeanA存在循环依赖:三级缓存--->二级缓存--->一级缓存
BeanB不存在循环依赖:三级缓存--->一级缓存
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穿城大饼

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值