JAVA,循环依赖,Spring

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

示例代码1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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,spring,循环依赖)