- 并非所有的构造函数依赖都不可以被解决,而是必须要保证先初始化的bean可以正常的被实例化,因为先初始化的bean需要从三级缓存中升级到二级缓存,也就是说先初始化的类中不可以通过构造函数注入的方式去注入循环依赖的bean
- 二级缓存的作用:如果多个类同时循环依赖同一个类,那么我们需要保证获取到的实例化对象是一样的,如果没有二级缓存,都从三级缓存中去获取,那么获取到的都是一个factory,通过fatory“生产”出来的bean可能是不同的
- 三级缓存中为什么不直接保存实例,而是使用一个ObjectFactory?为了方便我们在需要对实例进行增强。
- 非单例的循环依赖注入,容器启动不会报错,因为只有非抽象、单例 并且非懒加载的类才能被提前初始bean。
- 因为循环依赖中先执行实例化的bean会从三级缓存中升级到二级缓存,所以如果这个bean使用了入@Async这种动态代理时,在初始化之后进行检查代理对象和二级环缓存中是否一致时,会发现不一致而报错,解决方法:
- 使用@Lazy注解,延迟加载
- 使用@DependsOn注解,指定加载先后关系
- 修改文件名称,改变循环依赖类的加载顺序
参考原文:https://www.cnblogs.com/wjxzs/p/14239052.html |