首页 > 其他分享 >spring三级缓存解决循环依赖原理

spring三级缓存解决循环依赖原理

时间:2024-07-08 16:10:51浏览次数:20  
标签:初始化 缓存 earlySingletonObjects 创建 Bean 实例 spring 三级

在Spring框架中,Bean的实例化和管理是通过其核心的IoC容器完成的。在处理Bean的依赖注入时,可能会遇到循环依赖的问题,即两个或多个Bean相互引用对方。为了解决这一问题,Spring采用了三级缓存机制。

一级缓存:singletonObjects

这是Spring IoC容器中的主要缓存,用于存放已经创建并完全初始化完毕的单例Bean。当一个Bean被请求时,Spring会首先从这个缓存中查找是否存在,如果存在则直接返回,避免了重复创建。

二级缓存:earlySingletonObjects

这是一个临时缓存,在Bean的创建过程中使用。当Bean的构造函数执行完毕,但尚未进行属性填充和初始化方法调用时,Bean会被暂时放入这个缓存中。这样,如果在这个阶段有其他Bean请求依赖于它,可以从这里获取到部分初始化的Bean实例,从而避免了循环依赖导致的异常。

三级缓存:singletonFactories

这是一个工厂缓存,存储的是Bean的Factory对象。当一个Bean正在被创建但还未完全初始化时,它的Factory对象会被放入这个缓存中。如果此时有其他Bean请求依赖于它,Spring会从这个缓存中获取Factory对象,并通过它来获取当前正在创建的Bean的一个部分初始化实例。

解决循环依赖的流程

  1. 当A依赖于B,B又依赖于A时,Spring在创建A的过程中,将A的Factory对象放入singletonFactories
  2. 当B创建时,尝试从singletonObjects获取A,由于A尚未完全初始化,所以获取不到,然后从earlySingletonObjectssingletonFactories中查找。
  3. singletonFactories中找到A的Factory对象,通过它创建A的部分初始化实例,并将这个实例放入earlySingletonObjects
  4. B现在可以使用A的部分初始化实例继续其自身的初始化过程。
  5. 同样的逻辑应用于A对B的依赖。
  6. 当A和B都完成了初始化后,它们会被移出earlySingletonObjects,放入singletonObjects,供后续的依赖注入使用。

按照以下步骤来描述这一过程:

  1. 开始创建Bean A:

    • 检查singletonObjects缓存中是否已有Bean A的实例。
    • 如果没有,开始实例化Bean A,并将Bean A的工厂对象放入singletonFactories缓存。
  2. 实例化Bean A:

    • 调用Bean A的构造器,创建Bean A的实例,但不填充依赖。
    • 将创建的Bean A实例(部分初始化状态)放入earlySingletonObjects缓存。
    • 标记Bean A为正在创建中。
  3. 解析Bean A的依赖:

    • 当解析到Bean A依赖Bean B时,尝试从singletonObjects获取Bean B。
    • 如果Bean B尚未创建,进入Bean B的创建流程。
  4. 开始创建Bean B:

    • 检查singletonObjects缓存中是否已有Bean B的实例。
    • 如果没有,开始实例化Bean B,并将Bean B的工厂对象放入singletonFactories缓存。
  5. 实例化Bean B:

    • 调用Bean B的构造器,创建Bean B的实例,但不填充依赖。
    • 将创建的Bean B实例(部分初始化状态)放入earlySingletonObjects缓存。
    • 标记Bean B为正在创建中。
  6. 解析Bean B的依赖:

    • 当解析到Bean B依赖Bean A时,不从singletonObjects获取,而是从earlySingletonObjects获取Bean A的早期引用。
  7. 继续创建Bean B:

    • 使用从earlySingletonObjects中获取的Bean A的早期引用,完成Bean B的依赖填充。
    • 完成Bean B的初始化,包括调用初始化方法等。
    • 将完全初始化的Bean B放入singletonObjects缓存,并从earlySingletonObjectssingletonFactories中移除Bean B的条目。
  8. 继续创建Bean A:

    • 使用从earlySingletonObjects中获取的Bean B的早期引用,完成Bean A的依赖填充。
    • 完成Bean A的初始化,包括调用初始化方法等。
    • 将完全初始化的Bean A放入singletonObjects缓存,并从earlySingletonObjectssingletonFactories中移除Bean A的条目。
  9. 结束:

    • 此时,Bean A和Bean B都已经完全初始化,并存储在singletonObjects中,可以供其他Bean依赖使用。

通过这种方式,Spring能够优雅地处理循环依赖,确保Bean的正常创建和初始化。

标签:初始化,缓存,earlySingletonObjects,创建,Bean,实例,spring,三级
From: https://www.cnblogs.com/use-D/p/18290095

相关文章

  • 免费分享一套SpringBoot+Vue超市(进销存,收银,积分)管理系统【论文+源码+SQL脚本】,帅呆
    大家好,我是java1234_小锋老师,看到一个不错的SpringBoot+Vue超市(进销存,收银,积分)管理系统,分享下哈。项目介绍本论文设计并实现了一套基于SpringBoot、Vue和MySQL的超市管理系统。该系统旨在通过现代化的Web应用技术提升超市管理效率和用户体验。首先,通过详细的需求分析和功......
  • Spring Boot Vue 毕设系统讲解 3
    目录项目配置类项目中配置的相关代码springBoot拦截器相关知识一、基于URL实现的拦截器:二、基于注解的拦截器三、把拦截器添加到配置中,相当于SpringMVC时的配置文件干的事儿:项目配置类项目中配置的相关代码首先定义项目认证授权拦截器  AuthorizationIntercep......
  • java springboot监听事件和处理事件
    在SpringBoot中,监听和处理事件是一种常用的模式,用于在应用程序的不同部分之间传递信息。Spring的事件发布/订阅模型允许我们创建自定义事件,并在这些事件发生时由注册的监听器进行处理。这里,我将提供一个简单的SpringBoot应用程序示例,其中将包括事件的定义、事件的发布以及事件......
  • Spring Framework
    SpringFramework一、Spring和SpringFramework的关系Spring指的是Spring技术栈,是一个全家桶。包括SpringFramework、SpringMVC、SpringBoot、SpringCloud、SpringData、SpringSecurity等。这些框架构成了Spring,其中SpringFramework是其他子框架的基础SpringFra......
  • javab毕业设计-基于Java的校园二手交易商城系统设计与实现,基于springboot+vue二手跳蚤
    文章目录背景介绍演示视频(进入B站观看画面更清晰):项目架构和内容获取(文末获取)部分功能展示用户前端系统管理后台项目相关文件为什么我?本章节给大家带来的是一个基于java的大学生二手交易平台系统设计与实现,可适用于校园二手交易系统,基于Java的二手交易商城系统,大学......
  • springboot在线商城系统源码idea开发mysql数据库
    下载地址:https://download.csdn.net/download/qq_41221322/89519994摘要近年来,网上购物成了风靡全球的一种现象,大家逐渐接受了网上下单,隔天取货的这种方式。我们分析了一些购物网站现有的不足,结合我们所学的知识,制作了一款购物网站程序。学以致用,语言采用了大学时期学习的J......
  • 设计与优化淘客返利系统中的分布式缓存架构
    设计与优化淘客返利系统中的分布式缓存架构大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!在设计和优化淘客返利系统中的分布式缓存架构时,我们面临着诸多挑战和考虑因素。本文将探讨如何利用现代缓存技术和分布式系统原理,设计一个高效、可扩展的缓......
  • 使用Spring Cloud构建微服务架构下的淘客返利系统
    使用SpringCloud构建微服务架构下的淘客返利系统大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!在当今互联网时代,微服务架构已成为构建大型复杂应用的主流方式之一。本文将深入探讨如何利用SpringCloud构建一个高可用、高性能的淘客返利系统,通过......
  • Spring Boot Redis 集群性能优化(基于 Redisson)
    1.SpringBootRedis集群性能优化(基于Redisson)1.1.版本说明1.2.为什么是Redisson1.3.参数优化1.3.1.Redisson配置参数1.3.1.1.通用参数1.3.1.2.集群参数1.3.1.3.最终参数配置1.4.从Nacos获取Redisson配置1.SpringBootRedis集群性能优化(......
  • java-spring boot光速入门教程(超详细!!)
    目录一、引言1.1初始化配置1.2整合第三方框架1.3后期维护1.4部署工程1.5敏捷式开发二、SpringBoot介绍springboot2.1搭建一个springboot工程2.2使用idea创建项目2.3在线创建姿势2.4项目的目录结构2.5项目的运行方式2.6yml文件格式2.7多环境配置2......