spring bean的循环依赖问题:通过三级缓存来解决。
一级缓存 用来缓存已经实例化和初始化好的bean,基本上算的上一个完成的bean。
二级缓存用来缓存只实例化好的bean,用于提前暴露bean对象。用于解决循环依赖。
三级缓存用来缓存每个bean的beanfactory工厂,主要用于保证提前暴露出去的bean和最终的bean是否一致,因为在bean初始化的过程中,有可能被aop,就是被代理对象替换了,如果是最终的bean和提前暴露的bean不一致也是有问题的。
为什么要用第三级缓存?只用二级缓存行吗?
答案:部分可行,bean如果被代理的话就不行。在bean生成过程中没有被aop的话,只使用两个缓存确实是可以的。但是当bean被代理后,代理的工厂也是需要缓存的,工厂的代理就放到了第三级缓存中,这样每次从工厂获取bean的时候就能保证是同一个bean,而不是每次都新生成一个bean。
记住一点,所有的单例bean在初始化时,都是首先被放入到第三级缓存中的,如果没有循环依赖,等bean直接初始化好以后,直接从三级到一级。只有当出现循环依赖的时候,bean才会从三级先到二级,也就是说,在二级里面的bean 都是有循环依赖的,是会被先拿出去用的,由于后面还会就行bean的初始化,导致bean有可能被进行aop,也就是进行动态代理,最终产生的bean和最先产生的bean不一致,为了避免这个问题,使用三级缓存。
spring bean的生命周期
1.实例化:会调用bean的构造方法进行实例化对象,所以spring无法解决构造方法带来的依赖注入。该对象的会提前暴露到二级缓存中,用于解决spring的循环依赖问题。
2.填充属性:注入bean中需要的对象
3.初始化:调用init方法进行bean的初始化,经过这个阶段的以后,bean就成为一个可用的对象。同时放入到一级缓存中
4.使用和卸载:正常使用和销毁。
可以参考连接: