讲一下spring处理循环依赖
时间: 2023-10-29 15:55:52 浏览: 91
Spring 处理循环依赖是通过三级缓存实现的。当两个 Bean 之间存在循环依赖时,Spring 容器会通过三级缓存来解决这个问题。
第一级缓存是单例对象缓存,用于存储已经创建的单例 Bean 实例。
第二级缓存是早期对象缓存,用于存储已经创建但还未完全初始化的 Bean 实例。
第三级缓存是 ObjectFactory 缓存,用于存储循环依赖的 Bean 实例的 ObjectFactory。
当创建 Bean A 时,如果 Bean A 依赖于 Bean B,而 Bean B 又依赖于 Bean A,这时候就会出现循环依赖。在这种情况下,Spring 容器会先创建 Bean A,然后将 Bean A 放入第二级缓存中,接着创建 Bean B,由于 Bean B 依赖于 Bean A,所以 Spring 容器会从第二级缓存中获取 Bean A 的早期对象,然后将其设置到 Bean B 中。接下来,Spring 容器会将 Bean B 放入第二级缓存中,并将 Bean A 和 Bean B 放入第三级缓存中的 ObjectFactory,以便后续获取。
当 Bean A 和 Bean B 的创建都完成后,Spring 容器会先完成 Bean A 的初始化,并将其从第二级缓存中移除,接着完成 Bean B 的初始化,并将其从第二级缓存中移除。最后,Spring 容器会将 Bean A 和 Bean B 从第三级缓存中的 ObjectFactory 中取出,并将 Bean B 注入到 Bean A 中,解决循环依赖问题。
总之,Spring 通过三级缓存机制来解决循环依赖问题,保证了 Bean 的正确创建和依赖注入。
阅读全文