首页 > 编程 > Java > 正文

JAVA,循环依赖,Spring

2019-11-06 07:11:11
字体:
来源:转载
供稿:网友

最近看到一个问题:如果有两个类A和B,A类中有一个B的对象b,B类中有一个A的对象a,那么如何解决这两个类的相互依赖关系呢?

示例代码1

1234567891011121314151617181920212223242526272829303132333435public 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:

12345678910111213141516171819202122232425262728293031323334353637383940public 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中也是通过依赖注入的方法来解决类的相互依赖问题。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表