Spring循环依赖源码剖析

 2023-09-15 阅读 27 评论 0

摘要:Spring循环依赖源码剖析 一、场景介绍 二、整理执行流程总结 三、源码分析 编写测试类 /*** 测试循环依赖*/@Testpublic void testCyclicDependence(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContex

Spring循环依赖源码剖析


一、场景介绍

在这里插入图片描述

二、整理执行流程总结

在这里插入图片描述

三、源码分析

  1. 编写测试类
    	/*** 测试循环依赖*/@Testpublic 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. python源码剖析第二版?将断点设置到类AbstractBeanFactory中,定位到创建单例bean的方法getSingleton(),进入此方法
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

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

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

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

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

在这里插入图片描述

循环依赖应该避免吗。在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

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

go循环依赖、在这里插入图片描述

在这里插入图片描述

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

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

在这里插入图片描述

@SpringBootApplication、在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

总结:

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

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/61921.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息