Spring 如何解决循环依赖这是一个非常经典的面试问题,那么 Spring 是如何解决循环依赖问题的呢?又是否能够让其解决循环依赖的方法失效呢? 一、JAVA 原生的循环依赖 在 JAVA 原生中遇到循环依赖时可以通过如下步骤解决。 实例化 A 对象 实例化 B 对象 往 A 对象中设置 B 对象 往 B 对象中设置 A 对象 但是有另外一种特殊情况,A 的构造方法参数中包含了 B,B 的构造方法参数中包含了 A,这种情况称为构造方法循环依赖。由于 A 和 B 都需要在实例化对象时提供参数,所以这种循环依赖是无解的。 二、Spring 中的循环依赖 如上所述,Spring 也是无法解决构造方法循环依赖的,但是属性循环依赖在实际使用中我们可以看到 Spring 是可以解决的。 Spring 的解决流程与我们上述的步骤一致: getBean——取得 A Bean,在 doCreateBean 方法中开始创建 Bean 操作。 createBeanInstance——实例化 A Bean。 populateBean——为 A Bean 设置参数,并调用 getBean 方法创建 B Bean。 == createBeanInstance——实例化 B Bean。 == populateBean——为 B Bean 设置参数,并调用 getBean 方法获得未构造完全的 A Bean。 … 经过以上流程,Spring 就解决了 Bean 的循环依赖,这里面涉及到一个比较关键的方法 getSingleton(String beanName, boolean allowEarlyReference)。 protected Object getSingleton(String beanName, boolean allowEarlyReference) { // Quick ch...