Spring中的循环依赖非常重要,一方面是源码中为了解决循环依赖做了很多处理,另一方面是面试中一旦问到Spring中比较高阶的问题,循环依赖必定逃不掉。如果回答得好,那么这就是必杀技,反之就是被面试官反杀。
循环依赖其实就是循环引用,也就是两个或则两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于C,C又依赖于A。如下图:
那么Spring 是如何解决循环依赖的呢:
Spring是通过递归的方式获取目标bean及其所依赖的bean的;
Spring实例化一个bean的时候,是分两步进行的,首先实例化目标bean,然后为其注入属性。
结合这两点,也就是说,Spring在实例化一个bean的时候,是首先递归的实例化其所依赖的所有bean,直到某个bean没有依赖其他bean,此时就会将该实例返回,然后反递归的将获取到的bean设置为各个上层bean的属性的。
据说是高频面试题,不得不记录一下,以防不备之需。模了一下头发,又向高薪迈出了一小步,迎娶白富美一大步。