Spring循环依赖源码剖析

Spring循环依赖源码剖析


一、场景介绍

Spring循环依赖源码剖析_第1张图片

二、整理执行流程总结

Spring循环依赖源码剖析_第2张图片
Spring循环依赖源码剖析_第3张图片

三、源码分析

  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的实例化操作)
    Spring循环依赖源码剖析_第4张图片
  3. 在此方法中,定位到实例化Bean的核心方法getBean(beanName),设置断点,进行跳转,并进入此方法中
    Spring循环依赖源码剖析_第5张图片
  4. 定位到getSingleton(beanName)方法,并断点进入此方法

Spring循环依赖源码剖析_第6张图片

  1. 从一级缓存中获取BeanA,获取不到
    Spring循环依赖源码剖析_第7张图片

  2. 将断点设置到类AbstractBeanFactory中,定位到创建单例bean的方法getSingleton(),进入此方法
    Spring循环依赖源码剖析_第8张图片Spring循环依赖源码剖析_第9张图片Spring循环依赖源码剖析_第10张图片

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

  1. 定位到doCreateBean方法,并进入
    Spring循环依赖源码剖析_第11张图片
    实例化BeanA
    Spring循环依赖源码剖析_第12张图片
    继续向下执行,加入到spring的三级缓存,是一个工厂
    Spring循环依赖源码剖析_第13张图片
    将BeanA的工厂对象存储到三级缓存
    Spring循环依赖源码剖析_第14张图片

BeanA属性填充
Spring循环依赖源码剖析_第15张图片

Spring循环依赖源码剖析_第16张图片
BeanA属性填充BeanB
Spring循环依赖源码剖析_第17张图片Spring循环依赖源码剖析_第18张图片
Spring循环依赖源码剖析_第19张图片

Spring循环依赖源码剖析_第20张图片

Spring循环依赖源码剖析_第21张图片

此处流程和创建BeanA的流程一致
Spring循环依赖源码剖析_第22张图片Spring循环依赖源码剖析_第23张图片
Spring循环依赖源码剖析_第24张图片
Spring循环依赖源码剖析_第25张图片

Spring循环依赖源码剖析_第26张图片

Spring循环依赖源码剖析_第27张图片

Spring循环依赖源码剖析_第28张图片
Spring循环依赖源码剖析_第29张图片

Spring循环依赖源码剖析_第30张图片

Spring循环依赖源码剖析_第31张图片

Spring循环依赖源码剖析_第32张图片Spring循环依赖源码剖析_第33张图片

Spring循环依赖源码剖析_第34张图片
Spring循环依赖源码剖析_第35张图片
Spring循环依赖源码剖析_第36张图片

Spring循环依赖源码剖析_第37张图片

Spring循环依赖源码剖析_第38张图片

Spring循环依赖源码剖析_第39张图片

Spring循环依赖源码剖析_第40张图片

Spring循环依赖源码剖析_第41张图片

Spring循环依赖源码剖析_第42张图片

总结:

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

BeanA存在循环依赖:三级缓存--->二级缓存--->一级缓存
BeanB不存在循环依赖:三级缓存--->一级缓存

你可能感兴趣的:(开源框架源码剖析,spring,三级缓存,循环依赖,源码分析)