循环依赖是有两个类,A依赖B,B又依赖A,这就会抛出异常。
如:
可通过Setter来进行赋值:
// TestAprivate TestB b; void setB(TestB b) { this.b = b; }// TestBprivate TestA a; void setA(TestA a) { this.a = a; }可使用中介组件来解决(也就是把类B中依赖类A交给另一个类C来实现):
public class TestA { private TestB b = new TestB(); void aMethod() { b.bMethod(); } void getName() { System.out.println("TestA"); }}public class TestB { void bMethod() { System.out.println("TestB#bMethod"); }}public class TestC { private TestA a = new TestA(); void printNameOfTestA() { a.getName(); }}可转移业务逻辑(也就是把原本类A的业务逻辑转移到类C中):
public class TestA { private TestB b = new TestB(); void aMethod() { b.bMethod(); }}public class TestB { private TestC c = new TestC(); void printNameOfTestA() { c.getName(); } void bMethod() { System.out.println("TestB#bMethod"); }}public class TestC { void getName() { System.out.println("TestA"); }}可采用回调接口(也就是类A实现类C,然后在类B中调用类C的接口):
public class TestA implements TestC { private TestB b = new TestB(); void aMethod() { b.bMethod(); } @Override public void getName() { System.out.println("TestA"); }}public class TestB { private TestC c; void printNameOfTestA() { c = new TestA(); c.getName(); } void bMethod() { System.out.println("TestB#bMethod"); }}public interface TestC { void getName();}