网上相关的spring源码阅读都是从refresh方法开始,这虽然确实是spring初始化的入口,但是初始化的链路实在是太长了,不免枯燥。
所以我们这次从结论开始,一层层了解IoC的初始化过程。
我们在这个过程中依然省略了相当多的细节,全部细节的话不是一两篇文章能搞定的。所以,大家发现有什么必须在这篇文章存在的细节或者有什么不清楚或者异议的话可以 email dongpo.li@hotmail.com

简单介绍

我们都知道,徒手撸一个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、

参考

https://juejin.im/post/5da59f585188254e915c9522