前言
Spring 如何解决的循环依赖,是近两年流行起来的一道 Java 面试题。其实笔者本人对这类框架源码题还是持一定的怀疑态度的。如果笔者作为面试官,可能会问一些诸如“如果注入的属性为 null,你会从哪几个方向去排查”这些场景题。那么既然写了这篇文章,闲话少说,发车看看 Spring 是如何解决的循环依赖,以及带大家看清循环依赖的本质是什么。
一、对象的实例化
1.创建对象的方式
-
new:最常见的方式(本质是构造器)
-
变形 1 : Xxx 的静态方法
-
变形 2 : XxBuilder/XxoxFactory 的静态方法
-
Class 的 newInstance():反射的方式,只能调用空参的构造器,权限必须是 public
-
Constructor 的 newInstance(Xxx):反射的方式,位于 java.lang.reflect.Constructor 可以调用空参、带参的构造器,权限没有要求
-
使用 clone() :不调用任何构造器,当前类需要实现 Cloneable 接口,实现 clone()
-
使用反序列化:从文件中、从网络中获取一个对象的二进制流
-
第三方库 Objenesis