最近看到一個問題:如果有兩個類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中也是通過依賴注入的方法來解決類的相互依賴問題。
