简单介绍
我们都知道,徒手撸一个IoC的话,其实就是一个HashMap<String, Object>,那在spring中,这个map中的数据是怎么一步步填充呢。
首先,spring源码中的这个map定义是
# org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#singletonObjects
/** Cache of singleton objects: bean name to bean instance. */
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
可以看到和一些徒手撸的IoC定义没什么不一样
说到这里就不得不说另外两个定义
/** 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);
这两个定义和上边的singletonObjects在一些文章中并称bean初始化的三级缓存,主要作用就是解决循环依赖。
具体实现细节参见 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, boolean)
我们说下实现思路
1、首先看singletonObjects有没有,有的话直接返回。这步没啥好说的,常规的缓存都是先看缓存中有没有,有就返回。
2、