Spring三级缓存解决了哪些循环依赖
1.1 属性-属性
@Service
public class InstanceA {@Autowiredprivate InstanceC InstanceC;
}@Service
public class InstanceC {@Autowiredprivate InstanceA InstanceA;
}
1.2 先属性-后构造函数
// 解释:就在是创建bean的时候,先创建InstanceA,后创建InstanceB
@Service
public class InstanceA {@Autowiredprivate InstanceC InstanceC;
}@Service
public class InstanceC {private InstanceA InstanceA;@Autowiredpublic InstanceC(InstanceA instanceA) {InstanceA = instanceA;}
}
2.为什么还需要@Lazy注解去解决循环依赖?
因为spring的三级缓存只能解决上面这两种循环依赖,还有其他的循环依赖无法解决。主要有下面三种情况
@lazy可以用来解决构造器注入这种方式下的循环依赖。
2.1 先构造-后属性
解释:就在是创建bean的时候,先创建InstanceC,后创建InstanceA
@Service
public class InstanceC {private InstanceA InstanceA;@Autowiredpublic InstanceC(InstanceA instanceA) {InstanceA = instanceA;}
}@Service
public class InstanceA {@Autowiredprivate InstanceC InstanceC;
}
2.2 构造函数-构造函数
@Service
public class InstanceC {private InstanceA InstanceA;@Autowiredpublic InstanceC(InstanceA instanceA) {InstanceA = instanceA;}
}@Service
public class InstanceA {private InstanceC InstanceC;@Autowiredpublic InstanceA(InstanceC instanceC) {InstanceC = instanceC;}
}
2.3 prototype 类型的循环依赖
@Service
@Scope("prototype")
public class A {@Autowiredprivate B b;
}@Service
@Scope("prototype")
public class B {@Autowiredprivate A a;
}
3.@Lazy注解解决循环依赖的底层原理
@Lazy注解是Spring框架提供的一种解决循环依赖问题的方式。当两个或多个Bean之间存在循环依赖时,可以使用@Lazy注解延迟初始化其中一个Bean,从而打破循环依赖