springboot 配置允许循环依赖

您所在的位置:网站首页 pom循环依赖解决 springboot 配置允许循环依赖

springboot 配置允许循环依赖

2023-12-26 14:46| 来源: 网络整理| 查看: 265

循环依赖报错:当启动项目时,可能出现程序不能启动的情况,查看调试日志,会提示 The dependencies of some of the beans in the application context form a cycle...

原因:SpringBoot 从 2.6 开始默认不允许出现 Bean 循环引用。而且这个是在Bean 定义上也就是类上就不允许出现循环引用。

解决方式         1、允许循环引用存在

                方式1.在全局配置文件设置允许循环引用存在:

spring: main: allow-circular-references:true

                方式2.在SpringApplicationBuilder 添加设置允许循环引用:

public static void main(String[] args) { new SpringApplicationBuilder(DemoApplication.class).allowCircularReferences(true).run(args); }         2、消除循环依赖

                Spring官方的初心是不希望开发者编写循环引用的代码,也就是说未来的某个版本可能强制不能使用循环引用,因此在项目中消除循环依赖是不得不面对的问题。

------------------------------------------------------------------------------------------------------------------------------

面试官:”Spring是如何解决的循环依赖?“

Spring框架(四) 三级缓存与循环依赖_singletonfactories_lingering fear的博客-CSDN博客

一级:singletonObjects 这个缓存也就是单例池 , 它存放的是完整的经过Bean生命周期的Bean

二级:earlySingletonObject 这个缓存存放的一个残疾Bean , 怎么理解呢?就是创建到一半就放进去了

三级:singletonFactories 这个缓存存放的是ObjectFactory , 表示用来 创建早期Bean 对象的工厂  

个人理解:

1、上图一个缓存就可以解决循环依赖, 为什么要三级缓存?

我们都知道 , AOP是Spring除开IOC的另外一大功能 , 而循环依赖又属于IOC的范围 , 所以如果想要这两者功能共存 , 就必须使用其他的手段:三级缓存 singletonFactories

 就是创建AService , 然后会产生一个AService的原始对象 , 并且key为beanName , Value为lambda表达式放入三级缓存 , 然后注入BService , 生成BService原始对象 , 此时需要注入AService就要从单例池获取 , 取不到 , 从二级缓存获取 , 取不到 , 然后从三级缓存获取 , 并执行lambda表达式,如果符合AOP的条件 , 那么返回代理对象 , 如果不符合 , 返回原始对象 , 然后赋值给BService的AService , 然后BService完成创建

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3