spring相互依赖怎么解决_被问到Spring循环依赖怎么解决?秀给面试官看!内附图解...
不知道最近有没有被一道Java面试题刷爆朋友圈,Spring框架的循环依赖如何解决。我收到了不少粉丝的提问,在了解到之后,也去网上查询了一些资料,自己也询问了身边的同事,总结出以下几个方面,今天就和我来看一看吧~
寻常情况下,如果问Spring内部怎么去解决循环的依赖性,一定是单默认的单例Bean中,属性互相引用的场景。假设几个Bean之间的互相引用,甚至循环依赖自己。
根据上面的两个图,我们先说一下循环依赖与原型的场景是不互相支持的,通常会走到AbstractBeanFactory类中下面的判断,然后反馈回异常问题。
if (isPrototypeCurrentlyInCreation(beanName)) { throw new BeanCurrentlyInCreationException(beanName); }
原因其实并不难,如果要创建一个新的A就会发现需要注入原型字段B,当创建新的原型字段B时又发现需要新的A。这就很尴尬了,禁止套娃!总不能靠猜去判断先是StackOverflow还是OutOfMemory?这也太难了吧~
所以Spring怕你猜起来困难,就非常贴心的出现了BeanCurrentlyInCreationException。真不愧是我最爱的框架。
在基于在构造器上的循环依赖,这就不必再多说了,官方文档有很明显的指示,想让构造器注入去支持循环依赖?这就不可能了,改代码吧······
那么默认单例的属性注入场景,那么Spring对循环依赖是如何支持的呢?
Spring解决循环依赖
这时候我们就不得不说到Spring的内部了,它内部维护了三个Map,这是什么?就是我们常说的三个缓存级别。这是为了让更好理解,其实并没有官方名字坐实这个三级缓存的概念。不过这不重要,接着看就是了。
在Spring的DefaultSingletonBeanRegistry类中,你就会发现它的上面有三个Map:
1.singletonObjects。这个或许是我们最熟悉的部分了,我们通常叫它:单例池,容器,它其实就是缓存创建完成单例Bean的地方。
2.singletonFactories。用来映射创建Bean的原始工厂。
3.earlySingletonObjects。它用来映射Bean的早期引用,这意思就是Map里的Bean并不完整,与其称之为Bean,倒不说它只是一个Instance.
再往后的两个Map就更像是一个“垫脚石”了,创建Bean时用了一下,用完就清理了。
循环依赖的本质
了解本质之后才能知道如何解决,刚才说了Spring如何处理循环依赖,首先,我们跳出“阅读源码”的思维,举个例子,如果让你实现下面的功能,你会如何去做?
1.将指定的一些类实例为单例
2.类中的字段同样实例为单例
3.必须支持循环依赖
假设类A是存在的,那么
public class A { private B b;
} // 类B:
public class B { private A a;
}
看到了吗?其实就是让你模仿一下Spring,假设A和B被修饰,而且类之间的字段假设是通过Autowired修饰,然后放到Map里面,经过处理之后再放到Map里面。
其实上述并不是“Spring如何去解决循环依赖”而是循环依赖的基本本质,其实在网上可以搜索到很多例子,完全可以去百度一下看一看,这可以让你不在阅读的泥潭里陷得太深进而忽略了问题本质,如果实在是看不懂,逆推Spring的实现原因效果会好很多。
问题的本质竟然在于two sum?
说到这里有没有觉得似曾相识?好像在什么时候见过似的,没错,和two sum的解题是很相似的。什么?你不知道two sum?two sum是刷题网站leetcode序号为1的题,也就是大多人的算法入门的第一题。经常有梗对于这个two sum,感兴趣的可以去看看。咳咳,跑题了,我们再回来
问题的内容是:先给你规定数组,再给定一个数字。再返回到数组里面允许通过相加得到指定数字的两个索引。我们举个例子,给定nums = [2, 7, 11, 15], target = 9 那么要返回 [0, 1],因为2 + 7 = 9这道题的优解是,一次遍历+HashMap:
class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { int complement = target - nums[i]; if (map.containsKey(complement)) { return new int[] { map.get(complement), i }; } map.put(nums[i], i); } throw new IllegalArgumentException("No two sum solution"); } }
这个时候就需要先去Map中寻找我们需要的数字,如果没有,那么就将数字先保存到Map里面,再寻找到需要的数字时,一起返回即可。
spring相互依赖怎么解决_被问到Spring循环依赖怎么解决?秀给面试官看!内附图解...相关推荐
- map 循环_被问到Spring循环依赖怎么解决?秀给面试官看!内附图解
不知道最近有没有被一道Java面试题刷爆朋友圈,Spring框架的循环依赖如何解决.我收到了不少粉丝的提问,在了解到之后,也去网上查询了一些资料,自己也询问了身边的同事,总结出以下几个方面,今天就和我 ...
- 筑基期第一式:深入Spring源码之第二节getBean全流程【循环依赖分析+扩展点分析】
getBean整体逻辑 AbstractBeanFactory#doGetBean方法 protected <T> T doGetBean(String name, @Nullable C ...
- 面试阿里被问到JVM,不逼逼赖赖,直接盘给面试官看!!!
面试阿里被问到JVM,不逼逼赖赖,直接盘给面试官看!!! 概述 JVM体系结构 类加载机制 类加载器 类加载过程 双亲委派机制 全盘负责委托机制 打破双亲委派机制 自定义类加载器实现 JVM运行时数据 ...
- spring 三级缓存_通过画图+视频把循环依赖、监听器等等spring源码讲明白了
大家在阅读源码的时候有没有这种感觉:每次要看源码的时候十分信誓旦旦逼迫自己努力看着源码,但是还没看多长时间就会感觉枯燥,无味没意思,所以我是十分不愿意去看源码,但是今天福利来了,有位大神通过画图+视频 ...
- 【Spring】SpringIOC容器启动过程源码分析 以及 循环依赖问题
1.Spring是什么 Spring是一款轻量级的开发框架 . 简而言之 Spring提高了开发效率 两个核心 IOC 和 AOP 1.1 IOC ( Inversion of Control ) 是 ...
- spring批量写入mysql数据库_快速使用组件-spring batch(3)读文件数据到数据库
tags: springbatch 1.引言 上一篇文章<快速了解组件-spring batch(2)之helloworld>对Spring Batch进行了入门级的开发,也对基本的组件有 ...
- 解决rpm包安装时的循环依赖问题
之前在安装rpm包的时候遇到如下循环依赖关系 安装A时提示需要B 安装B时提示需要A 其实解决办法很简单,只需在安装的时候将两个rpm包名都附上,例如 rpm -ivh A.rpm B.rpm ...
- 阿里 mysql 架构_阿里java架构教你怎么用mysql怒怼面试官
说一下mysql比较宏观的面试,具体咋写sql的这里就不过多举例了.后面我还会给出一个关于mysql面试优化的试题,这里主要说的索引和B+Tree结构,很少提到我们的集群配置优化方案. 1.索引是什么 ...
- js map 排序_数组方法写给女友的一系列 JS 数组操作(建议收藏 | 内附思维导图)...
前言 最近和女友,咳咳...(说出来可能会被打s)学习JS数组方法,用几个字形容的话就是听说过,实际使用.遇到的时候就分不清具体方法会得到怎样的结果. 今天我将通过这篇文章好好整理一下关于JS数组的方 ...
最新文章
- sklearn基于make_scorer函数为Logistic模型构建自定义损失函数并可视化误差图(lambda selection)和系数图(trace plot)+代码实战
- POJ2985 The k-th Largest Group(平衡树查询第K大)
- 广域网域内流量工程优化—Vecloud
- 设定printf在终端输出的颜色
- QT如何让窗口放置在屏幕正中间
- 新款苹果电脑_苹果真牛!iPhone的软件,苹果电脑上也照样可用了
- vue-cli4 无法访问static资源问题
- linux下C获取系统时间的方法
- vector,list,deque容器的迭代器简单介绍
- 浙江大学计算机学院各专业介绍ppt模板,浙江大学-汇报答辩PPT模板.pptx
- msyql创建数据库并指定字符集
- 南方cass提取坐标生成表格_如何在CAD中或者CASS中将坐标导入到EXCEL表格(个人笔记)...
- 阿里云服务器被攻击了怎么办?
- Java为图片加水印
- 小白也能学会装“win10系统”,轻松撩妹
- 关于部分手机使用听筒模式播放音频时没有声音的问题
- 【Python】经典问题创建一个矩形类,定义方法 属性 初始化
- python 网格策略_Python版简单网格策略
- SSL P2719 买礼物的艰辛
- PRINCE2主题:商业论证,收益导向的管理艺术
热门文章
- HP 380 G5安装CentOS7时找不到P400 raid卡
- [net]ftp ssh http telnet https服务及端口
- Know more about Oracle Latches
- SpringMVC连接MongoDB操作数据库
- (一)SpringMVC学习笔记-概述
- (转)Linux SLUB 分配器详解
- 利用memcache来保存tomcat的session会话
- CDialog::OnOk()作用
- 在maven 2工程中加入iTextAsian支持(maven添加自定义jar包到本地仓库)
- |Vijos|图论最短路|P1082 丛林冒险