首页 > 其他分享 >详解Spring循环依赖,以及spring如何通过三级缓存解决循环依赖问题

详解Spring循环依赖,以及spring如何通过三级缓存解决循环依赖问题

时间:2024-07-16 21:56:04浏览次数:17  
标签:初始化 缓存 对象 spring bean 依赖 创建 循环

 首先为了方便理解后面的图解,首先要了解spring的bean的生命周期,下图是sping的bean的生命周期流程图。

图解:就是在初始化实例化A时,发现A里面依赖了B,所有看B是否在容器中存在,结果B不存在又去实例化B,B中又依赖与A,但是也不存在,就这样陷入一个死循环就是循环依赖。

图解:实例化A时会先根据构造函数去创造一个原始对象A(未初始化版),因为还没有走完生命周期所以先把它缓存到二级缓存中。初始化A时发现要依赖B,若发现存在则直接返回,若不存在则开始初始化B,先根据构造函数创建一个原始对象B(未初始化版),然后也把它缓存到二级缓存中,继续初始化发现B依赖A,则B先从二级缓存中取出原始对象A,这样就把B创建成功放入单例池(一级缓存),然后原始对象A就可以从容器中拿到B,这样A也就可以创建成功将A也放入到单例池(一级缓存)。

这样看貌似是二级缓存,那三级缓存是否有存在的必要尼?

三级缓存肯定是有存在的必要的,若A是代理对象则需要三级缓存。

首先科普一下什么是代理对象,了解spring的bean的生命周期的人知道,spring创造一个bean要先通过构造函数创造一个原始对象,再经过一系列的初始化操作再会创建一个完整的bean。而代理对象就是在原始bean初始化到倒数第二步,也就是

这一步(可以参考上面的流程图)被加强的bean。被加强的bean就是在原始bean的基础上先将原始bean包装然后再加上他的增加部分而封装进而创建的一个代理对象。也就是代理对象是区别于原始对象A的一个新的对象。而spring生命周期中创建bean是通过工厂创建的(包括代理对象)

然后回来,了解bean的生命周期的人知道,spring创建bean对象和初始化bean对象是分开的,而三级缓存解决的是在初始化过程中发生的循环依赖问题,所以如果是代理对象时在初始化过程中会创建一个新的对象,而一级缓存和二级缓存功能里面并没有创建对象的功能,而三级缓存中可以缓存对象工厂,从而可以创建对象所以spring采用三级缓存来解决循环依赖的问题。以下是三级缓存解决循环依赖的流程图以及图解。

图解:实例化A时,原始对象A会先生成一个工厂对象缓存到三级缓存,然后依赖注入会发现需要注入B,去容器中找,发现B不存在,此时去实例化B,此时原始对象B也会先创建一个工厂对象缓存到三级缓存,依赖注入时发现要注入A,此时会从三级缓存中获取A的工厂对象,若A是代理对象则工厂会创建代理对象,若A不是代理对象则会创建一个普通的bean对象(该图给的流程图只有A是代理对象的情况,若A不是代理对象流程图与上述图是一样的)然后把对象(创建的对象还是半成品)注入给B的同时缓存到二级缓存(若别的对象依赖A就可以从二级缓存中拿到),然后B就可以创建成功,B就会放入到单例池中(一级缓存),B对象创建成功就会把B注入A这样A也就可以创建成功。

标签:初始化,缓存,对象,spring,bean,依赖,创建,循环
From: https://blog.csdn.net/qq_75246832/article/details/140476197

相关文章

  • Spring注解的实现原理【简单实现一个注解】
    在Java中实现一个简单的注解涉及以下几个步骤:定义注解:使用@interface关键字定义一个注解接口。添加元注解:使用元注解(如@Target和@Retention)来定义注解的作用域和生命周期。importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importj......
  • Conda的冲突解决艺术:在包依赖中寻找和谐
    Conda的冲突解决艺术:在包依赖中寻找和谐在Python开发中,Conda是一个强大的包管理器和环境管理器,它允许用户安装和管理不同版本的包,同时保持环境的隔离。然而,随着项目复杂性的增加,包之间的依赖冲突可能成为开发者面临的棘手问题。本文将深入探讨如何在Conda中使用包依赖冲突......
  • 构建艺术:精通Gradle依赖替换的策略与实践
    构建艺术:精通Gradle依赖替换的策略与实践在软件开发的构建过程中,依赖管理是确保项目顺利进行的关键环节。Gradle,作为一款强大的构建工具,提供了灵活的依赖管理功能,包括依赖替换,这使得开发者能够精细控制项目所依赖的库版本。本文将深入探讨如何在Gradle中配置项目依赖替换,包......
  • idea 创建springboot项目
    参考——https://blog.csdn.net/Alger_/article/details/128749131 ——————————需要联网创建 ————创建项目newproject——》Springinitializrnext springboot的版本与jdk版本有关2.x:jdk83.x:jdk17只选择web下的springweb——》create 项目需......
  • 基于SpringBoot+Uniapp的微信阅读小程序系统设计与实现(源码+lw+部署文档+讲解等)
    文章目录前言项目运行截图技术框架后端采用SpringBoot框架前端框架Vue可行性分析系统测试系统测试的目的系统功能测试数据库表设计代码参考数据库脚本为什么选择我?获取源码前言......
  • Spring与设计模式总览
    Spring框架中的设计模式详解Spring框架不仅是Java企业级开发的主力军,其设计还蕴含了大量经典设计模式。这些模式贯穿于Spring的核心组件中,提升了框架的可维护性和扩展性。本文将深入探讨Spring框架中常见的设计模式及其应用。1.工厂模式(FactoryPattern)工厂模式是最常见......
  • springboot+vue前后端分离项目-项目搭建13-树形表
    效果一、后端1.新建表category 2.新建entity,com/example/demo/entity/Category.java3.新建Mapper,com/example/demo/mapper/CategoryMapper.java 4.新建Controller,com/example/demo/controller/CategoryController.java主要代码逻辑如下,封装成List<Category>,前端结合......
  • Springboot Study-入门&配置
    SpringbootStudy入门&配置1.入门构建了Springboot工程,创建springboot项目,完成了第一个项目helloworld2.配置2.1配置分类:properties>yml>yaml(优先级)2.2yaml基本语法:大小写敏感,数值前要有空格,空格缩进表示层级关系数据格式:*对象*数组(使用“-”表示数组每个元......
  • 基于Springboot的博物馆管理系统
    全文内容包括:1、采用技术;2、系统功能;3、系统截图;4、配套内容。索取方式见文末微信号,欢迎关注收藏!一、采用技术语言:Java1.8框架:SpringBoot数据库:MySQL5.7、8.0开发工具:IntelliJIDEA旗舰版其他:Maven3.8以上二、系统功能用户管理:负责注册用户的信息维护,包括用户账号的创建......
  • SpringBoot-集成 webSocket
    1.WebSocket简介2.springboot集成javax注解方式pom<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>配置类/*****blog.coder4j.cn*......