首页 > 其他分享 >Spring中如何解决循环依赖

Spring中如何解决循环依赖

时间:2024-03-30 23:55:37浏览次数:23  
标签:缓存 实例 Spring testService1 依赖 三级 testService2 循环

八字真言:“三级缓存,提前暴露”

此文只是介绍简单的情况便于理解,实际上场景会更复杂、情况会更多,但是原理相通。

一、什么是循环依赖?

从字面上来理解就是A依赖B的同时B也依赖了A,就像下面这样   0 上图是简单的循环依赖,也会存在A依赖B,B依赖C,C依赖A这种循环,或者更复杂的情况。 (在实际工作中应该尽量避免出现循环依赖的情况)

二、什么情况下循环依赖可以被处理?

0

三、Spring是如何解决的循环依赖?

三级缓存:

一级缓存 : Map<string,object> singletonObjects,单例池,用于保存实例化、属性赋值(注入)、初始化完成的 bean 实例 二级缓存 : Map<string,object> earlySingletonObjects,早期曝光对象,用于保存实例化完成的 bean 实例 三级缓存 : Map<string,objectfactory<?>> singletonFactories,早期曝光对象工厂,用于保存 bean 创建工厂,以便于后面扩展有机会创建代理对象。

流程图:

0

总结:

假如testService1依赖testService2,testService2依赖testService1 Bean初始化流程:
  1. 创建 testService1实例,实例化的时候把 testService1 对象⼯⼚放⼊三级缓存,并提前先暴露出来;
  2. testService1 注⼊属性时,发现依赖 testService2,此时 testService2 还没有被创建出来,所以去实例化 testService2;
  3. 同样,testService2注⼊属性时发现依赖 testService1,它就会从缓存里找 testService1对象。依次从⼀级到三级缓存查询 testService1,从三级缓存通过对象⼯⼚拿到 testService1,发现 testService1虽然不太完善,但是存在,把 testService1 放⼊⼆级缓存,同时删除三级缓存中的 testService1,此时,testService2 已经实例化并且初始化完成,把testService2放入⼀级缓存
  4. 接着testService1继续属性赋值,顺利从⼀级缓存拿到实例化且初始化完成的testService2对象,testService1对象创建也完成,删除⼆级缓存中的 testService1,同时把testService1放⼊⼀级缓存
  5. 最后,⼀级缓存中保存着实例化、初始化都完成的 testService1、testService2 对象

标签:缓存,实例,Spring,testService1,依赖,三级,testService2,循环
From: https://www.cnblogs.com/MuXinu/p/18106258

相关文章

  • SpringBoot学习笔记
    ssm:https://www.bilibili.com/video/BV1Fi4y1S7ix/SpringBoot2:https://www.bilibili.com/video/BV15b4y1a7yG/1、概述Spring配置繁琐,依赖设置繁琐;SpringBoot可以简化Spring的初始搭建和开发过程SpringBoot优点:自动配置。起步依赖,辅助功能(内置tomcat服务器等)最简SpringBoot......
  • spring多数据源动态切换的实现原理及实现
    AbstractRoutingDataSource是Spring框架中的一个抽象类,可以实现多数据源的动态切换和路由,以满足复杂的业务需求和提高系统的性能、可扩展性、灵活性。应用场景多租户支持:对于多租户的应用,根据当前租户来选择其对应的数据源,实现租户级别的隔离和数据存储。分库分表:为了提高性......
  • SpringBoot 手动控制事务,即编程式事务
    前置知识Spring事务默认只在发生未捕获的RuntimeException时才回滚SpringAOP异常捕获需要被拦截的方法显式的抛出异常。默认情况下AOP只捕获RuntimeException类的异常,但可以通过配置来捕获特定的异常手动控制事务案例在日常开发中,如果没办法使用@Transactional注......
  • java毕业设计企业人事管理系统(Springboot+mysql+jdk1.8+maven3.39)
    本系统(程序+源码)带文档lw万字以上 文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着信息技术的快速发展,企业管理逐渐向数字化、智能化方向迈进。人事管理作为企业内部管理的重要组成部分,其信息化水平直接关系到企业的运行效率和管理水......
  • java毕业设计汽车零件厂绩效管理(Springboot+mysql+jdk1.8+maven3.39)
    本系统(程序+源码)带文档lw万字以上 文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在现代企业管理中,绩效管理是连接企业战略目标与员工个人目标的桥梁,它对于提升员工工作积极性、优化团队协作效率以及推动企业持续发展具有重要作用。对于......
  • 【攻防技术系列+漏洞复现】-- Spring篇
    阅读用时:20min一、什么是springSpring框架是一个功能强大的Java应用程序框架,旨在提供高效且可扩展的开发环境。其本身也是模块化的,应用程序可以选择所需要的模块。这些模块缩短应用程序的开发时间,提高了应用开发的效率例如,在JavaWeb开发的早期阶段,程序员需要编写大量的代......
  • 自学-C语言-基础-注释、变量、运算符、判断、循环
    运行环境DevC++DevC++官网认识C语言C语言是一种通用的、面向过程式的计算机程序设计语言。1972年,为了移植与开发UNIX操作系统,丹尼斯·里奇在贝尔电话实验室设计开发了C语言。C语言是一种广泛使用的计算机语言,它与Java编程语言一样普及,二者在现代软件程序员......
  • Spring Boot 基本配置之依赖管理starter pom
    在SpringBoot快速搭建中搭建了一个没有任何功能的项目,查看其pom.xml文件:项目pom.xml文件有两个核心依赖,分别是spring-boot-starter-parent和spring-boot-starter。仔细观察可知spring-boot-starter-parent中有版本号,而spring-boot-star......
  • 面试题:Spring Boot Starter的功能与使用场景
    SpringBootStarter是SpringBoot框架为了简化项目的初始化和配置工作而设计的一种模块化依赖管理方式。它主要具有以下几个关键功能和使用场景:功能:1.依赖管理每个Starter都是一组相关的依赖项集合,这些依赖项都是为了实现特定功能而预先配置好的。例如,`spring-boo......
  • Spring Boot基本配置之定制Banner
    在SpringBoot快速搭建中已经使用了SpringBoot框架,在启动的时候会有一个默认的启动图案如下:这个图案是可以修改为自定义项目定制的Banner,具体操作如下:1、在src/main/resources下新建一个banner.txt。2、......