Spring如何解决循环依赖(精简版)

       Spring如何解决循环依赖(精简版)_第1张图片

        上面两个bean在属性注入时都需要彼此,因此就造成了循环依赖的问题

       

        首先,bean的初始化完成需要经过三个过程:bean的实例化、属性注入、和最终的初始化完成,循环依赖就发生在属性注入的过程中

        我们都知道spring解决了循环依赖问题,那究竟是怎么解决的呢?

        实际上,spring是使用三级缓存解决了这个问题,而三个缓存本质上就是三个Map集合

 

Spring如何解决循环依赖(精简版)_第2张图片

         

        我们假设有A、B两个bean之间互相依赖

        首先,A实例化完成后会进行属性注入(A此时已存在于三级缓存bean对象工厂),在注入的过程中,A发现需要一个B对象注入,而此时,容器中发现并没有B,于是此时就会去实例化B

        实例化后的B对象进行属性注入的时候,发现需要一个A对象,此时它就会从一级缓存一直查询到三级缓存,发现三级缓存中存在一个实例化完成的A对象,于是将其放入二级缓存中同时将三级缓存中的删除,并完成B对象的属性注入,完成属性注入并初始化完成的B对象会放置在一级缓存当中

        此时,A对象继续进行属性注入,发现一级缓存中存在B对象,对使用其进行注入,并将初始化完成的A放入一级缓存中,删除二级缓存中的A对象,最后A、B两个对象都存在于一级缓存中,整个过程就结束了

        

        此外,估计大家也会疑惑为什么需要三级缓存,明明一个缓存存放实例化完成的bean,一个存放初始化完成的bean不就足够了吗,为什么还需要三个缓存呢?

        实际上,在bean创建过程中还有可能产生代理对象,因此,三个缓存刚好够存放

你可能感兴趣的:(java,spring,spring,boot)