首页 > 编程语言 >JAVA八股与代码实践----解决循环依赖

JAVA八股与代码实践----解决循环依赖

时间:2024-11-23 15:58:05浏览次数:10  
标签:初始化 八股 缓存 JAVA name bean ---- Bean 依赖

1、三级缓存

1.1、一级缓存

一级缓存:singletonObjects

功能:存储已完全初始化完成的单例 Bean。

作用:

  1. 解决完全初始化后的 Bean 的复用问题:

    • 一级缓存是最终的 Bean 存储地,用于存储所有已完成初始化的单例 Bean。

    • 任何时候需要一个单例 Bean,都会优先从一级缓存中获取,避免重复创建。

  2. 提高性能:

    • 如果 Bean 已经完成初始化,直接从一级缓存中返回,性能最高。

局限性:

  • 无法解决循环依赖问题,因为 Bean 必须完全初始化后才能放入一级缓存。如果在 A 的创建过程中需要依赖 B,但 B 尚未完成初始化,就无法通过一级缓存获取。

1.2、二级缓存

 

 

二级缓存:earlySingletonObjects

功能:存储已经实例化但尚未完成初始化的 Bean(半成品)。

作用:

  1. 解决循环依赖中 Bean 实例提前引用的问题:

    • 如果 Bean A 正在创建过程中(未完成初始化),但 Bean B 依赖 Bean A,可以从二级缓存中获取 Bean A 的早期引用,避免重复创建 Bean A。

  2. 减少三级缓存(代理创建)的性能开销:

    • 二级缓存中存储的是 Bean 的实际实例,而不是代理对象。依赖方直接拿到的是一个实际的 Bean(虽然未完全初始化),因此效率比通过三级缓存获取代理更高。

局限性:

  • 如果依赖链中涉及代理对象(如 AOP 或 CGLIB 代理),二级缓存无法直接提供代理对象,仍需要三级缓存介入。

1.3、三级缓存 

解决代理对象的循环依赖

 

三级缓存:singletonFactories

功能:存储对象工厂(ObjectFactory),用于生成代理或提前暴露对象引用。

作用:

  1. 解决复杂循环依赖问题:

    • 当二级缓存无法提供实际实例(如需要动态代理对象时),三级缓存通过 ObjectFactory 动态生成 Bean 的早期引用(可以是代理对象)。

    • 将代理对象提前暴露,供依赖方使用,避免循环依赖导致的死锁。

  2. 提供灵活性:

    • 三级缓存可以生成动态代理对象(如 AOP 增强的 Bean)。

    • 支持更复杂的场景,比如对依赖 Bean 的某些初始化行为进行自定义。

局限性:

  • 三级缓存的性能稍低于一级和二级缓存,因为每次需要通过 ObjectFactory 动态创建对象。

三级缓存伪代码

// 示例:Bean 循环依赖伪代码
public class BeanFactory {
    private final Map<String, Object> singletonObjects = new HashMap<>(); // 一级缓存
    private final Map<String, Object> earlySingletonObjects = new HashMap<>(); // 二级缓存
    private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(); // 三级缓存

    public Object getBean(String name) {
        // 检查一级缓存
        Object bean = singletonObjects.get(name);
        if (bean == null) {
            // 检查二级缓存
            bean = earlySingletonObjects.get(name);
            if (bean == null) {
                // 检查三级缓存,提前暴露对象引用
                ObjectFactory<?> factory = singletonFactories.get(name);
                if (factory != null) {
                    bean = factory.getObject();
                    earlySingletonObjects.put(name, bean);
                }
            }
        }
        return bean;
    }

    public void registerBean(String name, Object bean) {
        singletonObjects.put(name, bean);
        earlySingletonObjects.remove(name);
        singletonFactories.remove(name);
    }
}

 2、懒加载

@Component
public class A {
    @Autowired
    @Lazy
    private B b;
}

@Component
public class B {
    @Autowired
    private A a;
} 
  • 循环依赖:

    • A 依赖 B,并且 B 又依赖 A
    • 如果 @Lazy 不存在,Spring 会在实例化 A 时尝试立即注入 B,但此时 B 的构造需要 A,形成死锁。
  • 通过 @Lazy 解决:

    • 使用 @LazyB 的初始化推迟到真正需要时再进行。
    • 当 Spring 初始化 A 时,先跳过对 B 的完整实例化,转而提供一个 B 的代理对象。
    • B 的真正初始化在其方法调用时触发,此时 A 已经完成初始化,不会再引发循环依赖问题。

3、三级缓存和懒加载的区别

 

标签:初始化,八股,缓存,JAVA,name,bean,----,Bean,依赖
From: https://blog.csdn.net/weixin_48968553/article/details/143992992

相关文章

  • 如何在360评估中控制得分分布?
    得分分布控制作用于评估打分时,评价人对一组被评价人的打分高低进行限制,避免老好人都打高分或恶意都给打低分的情况。得分分布控制包括总分分布控制和各个指标的得分分布控制。注意得分分布控制仅针对一个评价人同时评价多个被评价人时才会产生效果。设置了得分分布控制时,评价......
  • 我没有见过这样的黄昏
    写在前面379字|景色|感触|诗歌|散文诗|生活|日常正文我没有见过这样的黄昏。整个世界像是一个孩子偷喝了大人的鸡尾酒,面颊绯红,对着自己喜欢的人嘿嘿傻笑。所有人似乎都沉浸在这个孩子的欢愉心情里,时间不再匆忙,让人不禁想要漫步。我看着你,你......
  • 牛客小白月赛105 C,D,E题解
    题目链接:C题本来想用搜索,发现不行后还是分类讨论了,我在原来的图形上加了一圈'x'方便判断,里面的搜索可要可不要。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;lllo=1e9+7,maxx=0,l,r,t;chara[4][250500];llmod=1e9+7;lln,m,k,z,b[500050]={0};/......
  • 路由选择算法概述及经典算法分析
    一、路由选择算法概述路由选择算法的目标:找到“从源节点到目的节点的最低开销路径”路由选择算法的第一种分类centralizedroutingalgorithm集中式路由选择算法集中式路由选择算法需要计算者具有“网络拓扑的全局连通性”和“全局链路开销”方面的完整信息。具有全局状态......
  • c# sqlite "unable to open database file"错误
    我这个问题是开发环境正常,打安装包后运行报错,记录一下一、解决连接的问题App.config<connectionStrings><addname="sqliteConnection"connectionString="DataSource=|DataDirectory|\UpperMaterial.db;Pooling=true;FailIfMissing=false"providerName="System......
  • springboot毕设 黔西南旅游景点信息交流平台 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景黔西南地区,以其独特的自然风光、丰富的民族文化、悠久的历史遗迹而闻名遐迩,吸引着越来越多的国内外游客前来探索与体验。然而,随着旅游业的快速发展,信......
  • springboot毕设 青岛黄海学院听课督导系统 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在高等教育日益重视教学质量与教学管理的背景下,青岛黄海学院作为一所充满活力与创新精神的高校,始终致力于提升教学质量与学生满意度。然而,传统的听课......
  • 2024年华为OD机试真题-数组拼接-Python-OD统一考试(E卷)
    最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客     每一题都含有详细的解题思路和代码注释,精选c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,发现新题及时跟新。题目描述现在有多组整数数组,需......
  • 科普文:软件架构之Linux系列【linux内核数据结构:链表、队列、映射、二叉树】
    概叙科普文:软件架构之Linux系列【linux内核数据结构汇总】-CSDN博客Linux内核提供了许多复杂的数据结构,这些结构被广泛用于各种不同的目的,例如存储设备管理、内存管理、进程管理等。以下是一些常见的数据结构以及它们的简要描述:双向链表(list):实现链表的数据结构,每个节点都......
  • 深入浅出学算法045-纪念品分组
    题目描述元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能超过一个给定的整数。为了保证在尽量短的时间内发完所有纪......