在模拟实现ioc过程中,因为想看看循环依赖注入的效果,就重写了toString方法,结果导致了栈崩溃。
大家都知道spring容器中的实例可以是单例的,这样有利于管理对象。
那么我们要在A中注入B,B中注入C,C中注入A,就会导致循环依赖。
public class ClassA {
@AutoWired
private ClassB b;
public ClassB getClassb() {
return b;
}
public void setB(ClassB b) {
this.b = b;
}
@Override
public String toString() {
return "ClassA{" +
"b=" + b +
'}';
}
}
@Component
public class ClassB {
@AutoWired
private ClassC c;
public ClassC getClassc() {
return c;
}
public void setC(ClassC c) {
this.c = c;
}
@Override
public String toString() {
return "ClassB{" +
"c=" + c +
'}';
}
}
@Component
public class ClassC {
@AutoWired
private ClassA a;
public ClassA getClassa() {
return a;
}
public void setA(ClassA a) {
this.a = a;
}
@Override
public String toString() {
return "ClassC{" +
"a=" +a
'}';
}
}
通过重写了toString方法,我们只要随便打印一个对象,就会造成栈溢出。
原因分析,toString方法中打印的其他对象的toString会间接循环,导致你的方法一直在调用方法,且没有返回,每次调用导致栈上升,最后导致栈溢出,所以在使用toString方法时需要注意到递归问题,不要造成了死递归。