回顾Spring中的循环依赖问题

本文深入探讨了Spring框架中解决循环依赖问题的方法,并详细分析了其采用的三级缓存机制,包括一级缓存存储完整对象、二级缓存存放非完整对象以及三级缓存利用ObjectFactory接口实现对象的延迟创建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 概述

根据循环依赖问题的流程图可知,当A类中包含B类的对象,B类中包含A类的对象,在对A和B进行创建,实例化以及初始化的时候会出现循环依赖的问题

二 Spring解决循环依赖的方式

Spring是将在A不存在的时候并不会去创建A,而是利用Spring提供的三级缓存来避免出现循环依赖。

三 Spring中解决循环依赖的三级缓存源码分析

三级缓存的源代码

public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
    
    //一级缓存
	/** Cache of singleton objects: bean name to bean instance. */
	private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);

    //三级缓存
	/** Cache of singleton factories: bean name to ObjectFactory. */
	private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);

    //二级缓存
	/** Cache of early singleton objects: bean name to bean instance. */
	private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);
}

一级缓存中的存储的是完整的对象,二级缓存存放的是非完整的对象。

@FunctionalInterface
public interface ObjectFactory<T> {

	/**
	 * Return an instance (possibly shared or independent)
	 * of the object managed by this factory.
	 * @return the resulting instance
	 * @throws BeansException in case of creation errors
	 */
	T getObject() throws BeansException;
}

三级缓存的使用是为了通过函数的接口ObjectFactory中的getObject方法方便调用匿名内部类来完成对象整体的步骤。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值