zoukankan      html  css  js  c++  java
  • Spring 循环依赖

    1. 如果是在构造方式中循环依赖,则直接报错

    @Component
    public class A {
    	public  A(B b) {
    		
    	}
    }
    
    @Component
    public class B {
    	public B(A a) {
    		
    	}
    }
    
    
    Description:
    
    The dependencies of some of the beans in the application context form a cycle:
    
    ┌─────┐
    |  a defined in file [C:A-projectcustomerconfigurationA.class]
    ↑     ↓
    |  b defined in file [C:A-projectcustomerconfigurationB.class]
    └─────┘
    

     2. Setter 方式不会报错,因为Spring分两步,先调用无参构造方法实例化Bean对象,将实例化结束的对象放到一个Map中,然后才会设置对象属性,结合我们的实例来看,,当Spring实例化了Class A、Class B,紧接着会去设置对象的属性,此时Class A依赖Class B,就会去Map中取出存在里面的单例B对象,以此类推,不会出来循环的问题。

     3. Spring的循环依赖的理论依据其实是基于Java的引用传递,当我们获取到对象的引用时,对象的field或属性是可以延后设置的(但是构造器必须是在获取引用之前)。

       Spring的单例对象的初始化主要分为三步: 

        ①:createBeanInstance:实例化,其实也就是 调用对象的构造方法实例化对象

        ②:populateBean:填充属性,这一步主要是多bean的依赖属性进行填充

        ③:initializeBean:调用spring xml中的init() 方法。

    从上面讲述的单例bean初始化步骤我们可以知道,循环依赖主要发生在第一、第二步。也就是构造器循环依赖和field循环依赖。

    那么我们要解决循环引用也应该从初始化过程着手,对于单例来说,在Spring容器整个生命周期内,有且只有一个对象,所以很容易想到这个对象应该存在Cache中,Spring为了解决单例的循环依赖问题,使用了三级缓存。三级缓存源码主要指:

    /** Cache of singleton objects: bean name --> bean instance */
    
    private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);
    
    
    /** Cache of singleton factories: bean name --> ObjectFactory */
    
    private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<String, ObjectFactory<?>>(16);
    
     
    
    /** Cache of early singleton objects: bean name --> bean instance */
    
    private final Map<String, Object> earlySingletonObjects = new HashMap<String, Object>(16);
    

      三级缓存怎么使用参照: https://blog.csdn.net/qq_35165000/article/details/108185093

     

  • 相关阅读:
    CodeForces 347B Fixed Points (水题)
    CodeForces 347A Difference Row (水题)
    CodeForces 346A Alice and Bob (数学最大公约数)
    CodeForces 474C Captain Marmot (数学,旋转,暴力)
    CodeForces 474B Worms (水题,二分)
    CodeForces 474A Keyboard (水题)
    压力测试学习(一)
    算法学习(一)五个常用算法概念了解
    C#语言规范
    异常System.Threading.Thread.AbortInternal
  • 原文地址:https://www.cnblogs.com/Ivyduan/p/13940636.html
Copyright © 2011-2022 走看看