java对象循环依赖问题

解决Java中的循环依赖问题——Spring级缓存 Spring级缓存是Spring框架提供的一种缓存机制,用于暂存已创建的Bean对象,以解决循环依赖问题。当Spring容器创建Bean时,如果遇到循环依赖,会先从缓存中获取已创建的Bean对象,而不是重新创建新的对象。通过启用Spring缓存功能,将已创建的Bean对象缓存起来,在遇到循环依赖时直接返回缓存中的对象,从而解决循环依赖问题。这是因为Spring级缓存机制会在创建Bean时先检查缓存中是否已存在相应的Bean对象,如果存在,则直接返回缓存中的对象,避免了循环依赖的死循环。 阅读详情

原文地址:http://leihuang.org/2014/11/13/Cycular-Dependency/


假设我们有一个类A,它包含了一个B的对象,同时类B也包含了一个A对象。那么此时不管你实例化哪一个类,都会出现StackOverflowError错误,这就是java对象循环依赖问题。类似于鸡和蛋的问题。

首先我们看下面这段错误的代码,分析其错误的地方。

public class CyclicDependencies {
    public static void main(String args[]){
        Chicken c = new Chicken() ;
        //Egg e = new Egg() ;
    }
}

class Chicken{
    private Egg e ;
    private int age ;
    public Chicken(){
        e = new Egg() ;
        setAge(10) ;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

}
class Egg{
    private Chicken chicken ;
    private int weight ;
    public Egg(){
        chicken = new Chicken() ;
        setWeight(1) ;
    }
    public int getWeight() {
        return weight;
    }
    public void setWeight(int weight) {
        this.weight = weight;
    }
}


Exception in thread "main" java.lang.StackOverflowError

这是上面代码报的错误,因为当你创建一个Chicken对象时,同时也需要一个Egg对象,而一个Egg对象也需要一个Chicken对象,这样一直循环下去就发生了栈溢出的错误。

那么如何来解决这个问题呢?我们可以给Chicken写一个代理类ChickenProxy,这样Egg包含的不再是Chicken而是代理类ChickenProxy,这样就利用了第三方来解决循环依赖问题。代码如下。

public class CyclicDependencies {
    public static void main(String args[]){
        Chicken c = new Chicken() ;
        Egg e = new Egg(c) ;

        System.out.println(c.getAge());
        System.out.println(e.getWeight());
    }
}

interface ChickenProxy{
    int getAge();
    void setAge(int age) ;
}

class Chicken implements ChickenProxy{
    private Egg e ;
    private int age ;
    public Chicken(){
        e = new Egg(this) ;
        setAge(10) ;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

}
class Egg{
    private ChickenProxy chicken ;
    private int weight ;
    public Egg(Chicken c){
        chicken = c ;
        setWeight(1) ;
    }
    public int getWeight() {
        return weight;
    }
    public void setWeight(int weight) {
        this.weight = weight;
    }
}



2014-11-13 15:41:41

Brave,Happy,Thanksgiving !


Spring 解决循环依赖的 3 种方式.docx 第一种:构造器参数循环依赖 Spring容器会将每一个正在创建的Bean 标识符放在一个“当前创建Bean池”中,Bean标识符在创建过程中将一直保持在这个池中。 因此如果在创建Bean过程中发现自己已经在“当前创建Bean池”里时将抛出BeanCurrentlyInCreationException异常表示循环依赖;而对于创建完毕的Bean将从“当前创建Bean池”中清除掉。 立即下载

相关推荐

别再手动算K值了!ZEMAX中两种锥透镜建模方法详解(标准面 vs. 轴锥面)

本文详细解析了ZEMAX中锥透镜的两种建模方法:标准面与轴锥面。通过对比两者的精度、计算效率和适用场景,帮助工程师在激光整形、光束匀化等应用中做出最优选择,并提供了参数设置和异常排查的实用技巧。

weixin_42548874的博客 321

java循环依赖

这三个缓存是按照相应的顺序依次使用的,即先从BeanDefinitionMap中查找,如果没有找到,则从BeanFactory缓存中查找,如果还没有找到,则从singletonObjects缓存中取,如果都没有找到,再创建实例并加入到singletonObjects缓存中。当我们创建A对象时,需要把B对象填充到A的b属性,当我们去容器里查找时,没有则会去创建B对象,同样需要把A对象填充到B的a属性,但这时容器里没有A对象,我们就需要去创建A对象,这时就陷入了循环。首先创建两个实体类:A和B。

weixin_45732391的博客 1543

金融科技创新中人工智能的应用:8篇优质论文精选(含2023)

随着科技的飞速发展,金融领域正经历着前所未有的变革。在这个过程中,人工智能技术发挥着越来越重要的作用。为了深入探讨金融人工智能的研究和应用,享享特地整理了几篇金融人工智能方面的论文,大家可以看一下金融人工智能方向最新的研究成果!面向金融领域的大型语言模型本文介绍了BloombergGPT,一个基于广泛金融数据训练的500亿参数模型。基于彭博(Bloomberg)广泛数据来源,建立了一个基于彭博数据的3630亿令牌数据集,并结合了额外3450亿通用数据令牌。

2401_82426425的博客 3212

java中的循环依赖以及解决方案

我们创建了两个类,一个类A,一个类B(当然循环依赖不一定只是两个类,可能是多个以及以上的类),在A里面引入了B,在B里面引入了A,这时候就构成了一个循环问题,看似无止境,无尽头他们之间的关系如下。

qq_40537587的博客 6661

云原生监控:Prometheus+Grafana监控Nginx实战

在云原生环境中,应用的高可用性和性能优化至关重要。Nginx作为一款广泛使用的高性能Web服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器,对其进行有效的监控能够及时发现潜在问题,保障服务的稳定运行。本文章的目的是详细介绍如何使用Prometheus和Grafana构建一套完整的监控系统来监控Nginx,范围涵盖从环境搭建、数据采集、存储到可视化展示的整个流程。

AI云原生与云计算技术学院 1574

《UDS协议从入门到精通》系列——图解0x14:清除诊断信息

图解0x14:清除诊断信息,简洁易懂,迅速上手!

车载系统攻城狮 4826

JAVAmianshi

https://www.cnblogs.com/pureEve/p/6546280.html

山重水复疑无路,柳暗花明又一村。 306

【定制功能】LVGL 页面管理

页面管理的主要针对实际复杂的UI项目的。支持多页面管理,包含页面跳转和返回(主要是方便项目功能管理)支持后台页面自动销毁、前台页面自动创建(主要是节约资源使用)支持语言切换逻辑(页面重建功能)支持主题切换逻辑支持页面切换动画效果首先,页面管理是针对act_src图层来讲的。仅在screens数组中供act_src切换的对象树才会被此页面管理功能所管理。这意味着,如果top_layer或者sys_layer图层上,有页面需要重建时,需要特殊处理(实际项目中top_layer或者。

Bigan(安)的博客 5751

百度推送java sdk学习记录

Sdk里面的推送入口类是BaiduChannelClient类,这个类的构造方法需要传入一个ChannelKeyPair的对象,而这个对象需要以一个appKey和secretKey创建。appKey是手机应用的应用key,secretKey是百度推送开发者在百度注册后分配的密匙。之后就可以调用BaiduChannelClient的推送消息的方法。基本每个推送方法都需要传入一个继承自ChannelR

tonyyl的专栏 1131

公文流转系统

公文录入区 | QLineEdit(文号/标题)、QComboBox(公文类型/紧急程度)、QTextEdit(正文)、QListWidget(附件列表)、QPushButton(上传附件/保存草稿/提交审批) |// 按时间范围获取。QStringList userNames = {"张三", "李四", "王五", "赵六", "钱七", "孙八", "周九", "吴十", "郑十一", "王十二"};

寒寒豆豆软件公司的博客 550

ESP32与DS18B20温度传感器的数据采集与告警系统

并且,通过自定义的微信告警功能,我们可以及时收到温度超过阈值的告警消息。随着物联网的快速发展,传感器在各种应用场景中发挥着重要的作用。本文将介绍如何使用ESP32微控制器与DS18B20温度传感器结合,通过串口输出和Web服务器实现温度数据的采集和监控,并使用自定义微信告警功能。上传完成后,打开串口监视器,您将看到ESP32连接到Wi-Fi网络,并开始监测温度。在您的计算机或移动设备上,打开一个Web浏览器,并输入ESP32的IP地址。在浏览器中输入ESP32的IP地址后,您将看到显示当前温度的页面。

loop_class349的博客 2246

前端项目用npm启动时Cyclic dependency循环依赖问题解决

有一次,跟新别人的代码且npm install后,启动时报错:Cyclic dependency; 最简单粗暴的解决方法就是,删除node_modules文件夹和package-lock.json文件。重新npm install,然后npm start 或npm run dev,正常启动。 ...

peiyongwei的博客 2684

电机控制基础,小白入门篇

电机,这个藏在风扇、电动车、机器人里的“动力心脏”,如何精准控制它的转速、方向甚至力量?这篇博客专为完全零基础的小白打造,用“说人话”的方式拆解电机控制的底层逻辑,帮你从“看不懂电路图”到“能调个简单电机”。 电机控制不是“大神专属”,只要掌握“电生磁、磁生力”的底层逻辑,加上动手实践,小白也能快速入门。这篇博客会陪你从“看电机转”到“让电机听话”,把复杂的控制原理变成能上手玩的“小实验”。准备好你的面包板和电机,我们一起开启“电控之旅”吧!

汽车电子软件领域知识分享 5609

记一次 Java 实体对象拷贝中的循环依赖与懒加载的问题

在 Java 开发中,对象拷贝是一种常见操作,尤其是在 DTO 转换或深层次对象传递时。然而,当实体对象涉及双向关联(如 @ManyToOne 和 @OneToMany)时,拷贝操作可能触发复杂的依赖问题,比如循环依赖或 LazyInitializationException。本文将通过两个实际案例,深入分析其原因并提出解决方案。

weixin_49076200的博客 683

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

解决 Java 反射时对象之间的循环依赖问题

解决Java 反射时对象之间的循环依赖问题

Jaemon 1040

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

JAVA中循环依赖的相关问题

作为一个刚毕业的渣渣,下面说一下自己对java中循环问题的理解,有不正确的欢迎各位大佬留言。 1.类A的构造方法中创建类B,类B的构造方法中创建A,对象是如何被创建的? public class A { B b = new B(); A(){ System.out.println("A的构造方法"); } }public class B {

czrbijiben的博客 2332

Spring解决循环依赖问题

例如,就是A对象依赖了B对象,B对象依赖了A对象。问题来了:A Bean创建 ——> 依赖了 B 属性 ——> 触发 B Bean创建 ——> B 依赖了 A 属性 ——> 需要 A Bean(但A Bean还在创建过程中)

Sword52888的博客 487

java与Spring的循环依赖

循环依赖你真的懂了吗

初心不忘、始终方得 1715

循环依赖详解及解决方案

上图就是循环依赖的三种情况,虽然方式不同,但是循环依赖的本质是一样的,就A的完整创建要依赖与B,B的完整创建要依赖于A,相互依赖导致没办法完整创建造成失败.缓存经过了完整生命周期的bean缓存未经过完整生命周期的bean,如果某个bean出现了循环依赖,就会提前。

一个菜鸟的博客 4784

Spring依赖注入之循环依赖问题详解

对象A依赖对象B,对象B依赖对象A,这是一种常见的依赖关系。为什么spring会有循环依赖问题?spring是怎么解决循环依赖问题

你看到的逆袭,只不过是一场预备很久,草蛇灰线,伏笔千里的反攻 1064

Spring IOC循环依赖问题

5.1 什么是循环依赖 循环依赖其实就是循环引⽤,也就是两个或者两个以上的 Bean 互相持有对⽅,最终形成闭环。⽐如A 依赖于B,B依赖于C,C⼜依赖于A。 注意,这⾥不是函数的循环调⽤,是对象的相互依赖关系。循环调⽤其实就是⼀个死循环,除⾮有终结 条件。 Spring中循环依赖场景有: 构造器的循环依赖(构造器注⼊) Field 属性的循环依赖(set注⼊) 其中,构造器的循环依赖问题⽆法解决,只能拋出 BeanCurrentlyInCreationExcepti.

moshubai的博客 387

spring三级缓存解决循环依赖

singletonObjects:缓存经过了完整生命周期的beanearlySingletonObjects:缓存未经过完整生命周期的bean,如果某个bean出现了循环依赖,就会提前。

aumiel的博客 1764

Spring的循环依赖的问题及解决

Spring的循环依赖的问题及解决 前言 说起Spring中循环依赖的解决办法,相信很多园友们都或多或少的知道一些,但当真的要详细说明的时候,可能又没法一下将它讲清楚。本文就试着尽自己所能,对此做出一个较详细的解读。另,需注意一点,下文中会出现类的实例化跟类的初始化两个短语,为怕园友迷惑,事先声明一下,本文的实例化是指刚执行完构造器将一个对象new出来,但还未填充属性值的状态,而初始化是指完成了属性的依赖注入。 一、先说说Spring解决的循环依赖是什么 Java中的循环依赖分两种,一种是构造器的

nanZhaiXiaoLang的博客 472

Spring @Scheduled + 循环依赖导致AOP失效问题

项目中发现循环依赖导致定时任务的AOP功能失效,通过分析发现当MyScheduler1与OCircleDependBean相互依赖时,Spring会提前暴露原始对象,使ScheduledAnnotationBeanPostProcessor获取到非代理对象,导致AOP失效。

weixin_43850504的博客 1574
上一篇: 禁止使用finalize方法
下一篇: java对象的生命周期
SpeedMe
博客等级 码龄15年 779粉丝 142原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值