前言
大家好,我是子路,一个靠Java吃饭的男人
前几天,有个B站的粉丝跟我讲,他去阿里面试的时候,被问到:如何理解Spring当中的循环依赖?
对于Spring中循环依赖这个问题,我有录制过详细的讲解视频,感兴趣的朋友可以去哔哩哔哩上看一下:子路玩Java
其实对于这个问题,又是被阿里这样的大厂面试官问出来,那么他肯定不是单纯的让你讲讲循环依赖的概念就可以了的,你在回答上要体现出你对于一个技术点的广度与深度的思维能力,才能让面试官更加认可你。
我这里就稍微表述一下吧,更详细的解析,大家可以去看看我关于这个问题拍的视频。
如何理解Spring当中的循环依赖?
问:如何理解Spring当中的循环依赖?
回答思路:首先在Spring Framework整个体系当中,我们的Bean是由一个BeanDefinition来构建的,就是BeanDefinition可以理解为我们Spring的一个建模,然后如果我们要理解循环依赖的话,那么首先我们要讲到我们的Springbean的生命周期(这个在我的前一篇文章中有讲到),看下图:
其中很重要的一个流程就是:
Spring在做完一系列验证之后,就回去从它开始要实例化Bean之前,会去容器当中,也就是Spring单例池当中获取一遍,看它存不存在就是有没有被创建,如果没有被创建,再去看一下它们有没有存在的二级缓存当中就是有没有被提前暴露。
如果都没有,那么我们的代码会接着往下执行——>创建X对象,创建完X对象之后,就会对这个X对象做一些初始化的工作:填充属性,在这个过程当中,它发觉X依赖Y,那么它就会走Y的生命周期流程。
和X一样,首先它会去Y做验证,然后判断Y有没有在单例池当中,如果没有在单例池当中的话,再判断Y有没有被提前暴露,这个时候Y是没有被提前暴露的,那Y也会接着往下执行,就会把Y给实例化好。接着再对Y做一些初始化工作,比如说把Y提前暴露,比如说把Y去做属性填充。
这个时候,当Y做属性填充,它发觉它要填充X,但是这时它又发觉X并没有被完整的实例化好,所以不能填充。它就不得不再去走一遍或者创建X的流程,那么又会走刚刚第一次X流程,在走X流程的过程中,它会发觉X已经被提前暴露了,所以它能够拿到一个已经提前暴露好的ObjectFactory所产生的一个X对象,那么这样子就完成了循环依赖。
特别提到:循环依赖是支持单例的,以及非构造方法注入的。
这里文字表述应该是能看懂的,如果还觉得混乱的话,我建议大家去看一下我B站上的视频。
Spring的重要性
毫不夸张的说,Spring是每一位Java人都必须掌握的框架,换句话说,你只要是做Java开发的,就没有不会Spring的。
之前,有个学生跟我讲,去面试的时候被怼了,面试官问多了几个关于Spring源码的问题,自己没有答上来,除此之外,其它的问题都感觉回答得蛮好。但最后面试官跟他说:连Spring都玩不转,你还是别做Java了吧!
这个学生觉得很委屈,几个问题没回答上来而已,不要就不要,有必要说这句话嘛?
我安慰他说,Spring是任何一个Java程序员都必须要充分掌握的,面试官这样说确实欠妥,但不失为一种鞭策。很多刚入行的程序员都认为,会一些简单的业务代码,能上手一些项目,就足以在这一行混口饭吃。忽略技术源码、底层的人不在少数,而这些恰恰是你能在行业中立足的关键。
好了,多余的话就不说了,我希望大家既然选择了Java开发这条路,就应该认真对待,要爱上Java。
上面是我在B站的视频,感兴趣的朋友可以去看看,关注一下,感谢大家支持!