视频字幕
Spring框架使用三级缓存机制来巧妙地解决单例Bean的循环依赖问题。一级缓存存放完全初始化好的单例对象,二级缓存存放早期暴露的单例对象,三级缓存存放用于生成早期对象的工厂。这种设计确保了在AOP代理场景下也能正确处理循环依赖。
循环依赖是Spring框架中常见的问题场景。当Bean A依赖Bean B,而Bean B又依赖Bean A时,就形成了循环依赖。如果没有特殊的处理机制,Spring容器在创建这些Bean时会陷入无限递归,最终导致内存溢出和应用启动失败。
现在我们来看Bean A的创建过程。首先Spring实例化Bean A,执行其构造方法。然后将用于创建Bean A的ObjectFactory放入三级缓存中。接下来Spring尝试填充Bean A的属性,发现需要依赖Bean B,于是开始创建Bean B。此时Bean A已经实例化但还未完全初始化。
接下来创建Bean B。Spring实例化Bean B并将其Factory放入三级缓存。在填充Bean B属性时发现需要Bean A,于是开始查找:一级缓存没有,二级缓存也没有,但在三级缓存中找到了Bean A的Factory。Spring调用这个Factory获取Bean A的早期引用,并将其放入二级缓存,然后注入到Bean B中。
最后完成整个循环依赖的解决过程。Bean B完成初始化后放入一级缓存,Bean A继续其初始化过程,注入完整的Bean B,然后Bean A也完成初始化并放入一级缓存。此时二级和三级缓存被清理。Spring的三级缓存机制成功解决了循环依赖问题,确保了AOP代理的正确性和单例Bean的完整性。