我们都知道循环依赖是通过引入三级缓存来解决的,但是并不是所有的循环依赖都能解决的
比如:
1、通过构造方法所形成的循环依赖,三级缓存是不能解决的,但是可以通过@Lazy注解解决循环依赖
@Component
public class AService {
private BService bService;
public AService(BService bService){
this.bService = bService;
}
}
@Component
public class BService {
@Autowired
@Lazy
private AService aService;
}
2、原型Bean的循环依赖
无法解决,因为原型Bean每次去获取的时候都是返回新的对象,在实例化A时已经生成了一个对象,然后在给B注入A属性时又会去获取一个新的A对象,这两个A对象是不一样的,最后会抛出异常
3、单例Bean的循环依赖
@Component
public class AService {
@Autowired
private BService bService;
}
@Component
public class BService {
@Autowired
private AService aService;
}
我就以上例子画了个流程图:
循环依赖的注入流程