springboot 配置允许循环依赖

编程入门 行业动态 更新时间:2024-10-06 06:46:34

<a href=https://www.elefans.com/category/jswz/34/1769943.html style=springboot 配置允许循环依赖"/>

springboot 配置允许循环依赖

循环依赖报错:当启动项目时,可能出现程序不能启动的情况,查看调试日志,会提示 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完成创建


 

更多推荐

springboot 配置允许循环依赖

本文发布于:2024-02-27 22:24:15,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1766226.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:springboot

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!