首页 > 编程知识 正文

循环依赖的解决办法,spring循环依赖解决方案

时间:2023-05-05 05:46:45 阅读:204755 作者:2572

循环依赖是有两个类,A依赖B,B又依赖A,这就会抛出异常。
如:

public class TestA { private TestB b = new TestB(); void aMethod() { b.bMethod(); } void getName() { System.out.println("TestA"); }}public class TestB { private TestA a = new TestA(); void bMethod() { System.out.println("TestB#bMethod"); } void printNameOfTestA() { a.getName(); }}

可通过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();}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。