JAVA循环依赖
最近看到一个问题:如果有两个类A和B,A类中有一个B的对象b,B类中有一个A的对象a,那么如何解决这两个类的相互依赖关系呢?
示例代码1
public class Test{
public static void main(String[] args) {
B testb = new B();
}
}
class A{
public B b;
public A (){
b = new B();
}
public void printB(){
System.out.println("Ab");
b.printA();
}
public void printA(){
System.out.println("AA");
}
}
class B{
public A a;
public B (){
a = new A();
}
public void printB(){
System.out.println("BB");
a.printA();
}
public void printA(){
a.printA();
}
}
可以看到A类的构造方法中,new了一个B的对象,同时B类的构造方法中,new了一个A的对象。
如果此时我们运行该类的话,会报如下错误:
Exception in thread "main" java.lang.StackOverflowError
问题出现的原因在于A类和B类之间出现了循环依赖。
那么是否有方法可以解决这个问题呢?答案是:有
示例代码2:
public class Test{
public static void main(String[] args) {
A testa = new A();
B testb = new B();
testa.b = testb;
testb.a = testa;
testa.printB();
testb.printA();
testa.print();
testb.print();
}
}
class A{
public B b;
public void printB(){
b.printB();
}
public void printA(){
System.out.println("AA");
}
public void print(){
b.printA();
}
}
class B{
public A a;
public void printB(){
System.out.println("BB");
}
public void printA(){
a.printA();
}
public void print(){
a.printB();
}
}
运行代码2,运行结果为:
BB
AA
AA
BB
在示例代码2中,testa和testb创建时调用的是类A和类B的默认构造方法,创建了类A和类B的实例。
然后将B的实例注入到类A中。testa.b = testb;
将A的实例注入到类B中。testb.a = testa;
testa.print()调用b.printA();b.printA()调用a.printA();a.printA()显示结果为AA
我们通过属性注入的方法,使得类A和类B不在出现示例代码1中的错误,并且使得两个相互依赖的类A和B可以调用相互依赖的方法。
事实上,spring中也是通过依赖注入的方法来解决类的相互依赖问题。
JAVA循环依赖的更多相关文章
- 有趣的bug——Java静态变量的循环依赖
背景 是的,标题没有错误,不是Spring Bean的循环依赖,而是静态变量之间的循环依赖. 近期的项目均是简单的Maven项目,通过K8S部署在阿里云上,其配置文件读取规则如下所示: (1) 优先读 ...
- 【spring】循环依赖 Java Vs Spring
菜瓜:水稻,这次我特意去看了java的循环依赖 水稻:哟,有什么收获 菜瓜:两种情况,构造器循环依赖,属性循环依赖 构造器循环依赖在逻辑层面无法通过.对象通过构造函数创建时如果需要创建另一个对象,就会 ...
- SpringBoot项目意外出现 循环依赖和注入的对象意外是Null的问题 Requested bean is currently in creation: Is there an unresolvable circular reference? 或 nested exception is java.lang.NullPointerException
1.Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ...
- 剑指架构师系列-Struts2构造函数的循环依赖注入
Struts2可以完成构造函数的循环依赖注入,来看看Struts2的大师们是怎么做到的吧! 首先定义IBlood与BloodImpl类: public interface IBlood { } pub ...
- spring循环依赖问题分析
新搞了一个单点登录的项目,用的cas,要把源码的cas-webapp改造成适合我们业务场景的项目,于是新加了一些spring的配置文件. 但是在项目启动时报错了,错误日志如下: 一月 , :: 下午 ...
- 面试中被问Spring循环依赖的三种方式!!!
什么是循环依赖? 循环依赖其实就是循环引用,也就是两个或则两个以上的 Bean 互相持有对方,最终形成闭环.比如A依赖于B,B依赖于C,C又依赖于A.如下图: 如果在日常开发中我们用new 对象的方式 ...
- 再谈spring的循环依赖是怎么造成的?
老生常谈,循环依赖!顾名思义嘛,就是你依赖我,我依赖你,然后就造成了循环依赖了!由于A中注入B,B中注入A导致的吗? 看起来没毛病,然而,却没有说清楚问题!甚至会让你觉得你是不清楚spring的循环依 ...
- Spring基础系列-Spring事务不生效的问题与循环依赖问题
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9476550.html 一.提出问题 不知道你是否遇到过这样的情况,在ssm框架中开发we ...
- spring如何解决单例循环依赖问题?
更多文章点击--spring源码分析系列 1.spring循环依赖场景2.循环依赖解决方式: 三级缓存 1.spring循环引用场景 循环依赖的产生可能有很多种情况,例如: A的构造方法中依赖了B的实 ...
随机推荐
- C语言的函数类型
C语言的函数类型与返回值类型不一致时出现,是以函数类型为标准; 而如果在java与c#语言中上述情况是编译错误的;
- 制作 OpenStack Windows 镜像 - 每天5分钟玩转 OpenStack(152)
这是 OpenStack 实施经验分享系列的第 2 篇. OpenStack 通过 Glance 镜像部署 instance,上一节我们介绍了 linux 镜像制作方法,windows 镜像与 lin ...
- ubuntu14.04 + OpenCV2.4.9 配置方法
1. 安装openCV 所需依赖库或软件: sudo apt-get install build-essential cmake libgtk2.0-dev pkg-config python-de ...
- Zabbix简介及安装
前言 未经监控就上线的系统,就是裸奔,耍流氓. 监控对我们来说太重要了,监控工具也有很多,像,Cacti,Nagios,Ganglia,Zabbix等等,今天我们要介绍的是Zabbix,它的功能很强大 ...
- 由于java.util.Arrays.asList(...)导致的异常
前言: Collections.toArray()与Arrays.asList() 是Java API提供的友好的相互转换工具,日常开发中用于列表和数组之间的转换非常方便,但今天测试时,发现一下隐藏的 ...
- Mysql删除表格之后,进行恢复
一:存在在PHPmyAdmin下找到表格导出然后再导入 二:当没有备份时,使用binlog功能进行恢复 先进入到/etc/my.cnf文件中. 在文件中添加一句:log-bin=mysql-bin 然 ...
- recyclerview item点击事件
recyclerview早就不陌生了,比起过去传统的listView,样式更多,也较为高效一点,这里整理一下recylerview中item的点击事件. recyclerview和listView不同 ...
- Java进制转换示例
收藏的代码,以备查询之用.进制之间转换都是以十进制作为中间层的. int os = 16; //十进制转成十六进制: Integer.toHexString(os); //十进制转成八进制 Integ ...
- 【JS】JavaScript中的执行环境与作用域
JavaScript中的执行环境定义了变量或函数有权访问的数据(每个函数都有自己的执行环境),全局执行环境是最外围的执行环境,在浏览器中,全局执行环境就是window对象,所以所有的全局变量和函数都是 ...
- Spring-boot 最小demo
POM 文件,注意红色部分: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http: ...