在上一讲末尾,我们让程序停留在了下面这行代码处,此时,getBean方法就完全是执行完了,这样,我们单实例bean就被创建出来了。
image.png
而且,创建我们单实例bean的流程牵扯到了很多很多东西,你得亲自跟踪一下Spring的源码才能有所体会,不然说再多也是白费口舌,当然了,你也可以在我上一讲中找到答案。

我们的bean创建出来之后,继续让程序往下运行,可以看到接下来就是通过以下for循环来将所有的bean都创建完。
image.png
那就让它创建其他的bean呗!创建流程不用我再详述一遍吧,跟我们单实例bean(即Blue对象)的创建流程是一模一样的,我们不停地按下F6快捷键让程序不停地往下运行,快速地过一遍就行了,这一过程我也就不再详细地记录了。

// Trigger post-initialization callback for all applicable beans…

当程序运行到下面这行代码处时,上面的那个for循环就整个地执行完了,也就是说,剩下所有的非懒加载的单实例bean都创建完成了。
image.png
让程序继续往下运行,直至运行到下面这行代码处为止。
image.png
可以看到,这儿是来遍历所有的bean,并来判断遍历出来的每一个bean是否实现了SmartInitializingSingleton接口的。哎,你对SmartInitializingSingleton接口还有印象吗?在讲解@EventListener注解的内部原理时,我们就讲解过它,你还记得吗?要是你不记得了,那么可以回顾回顾《Spring注解驱动开发第40讲——你晓得@EventListener这个注解的原理吗?》这一讲。

OK,所有的bean都利用getBean方法创建完成以后,接下来要做的事情就是检查所有的bean中是否有实现SmartInitializingSingleton接口的,如果有的话,那么便会来执行该接口中的afterSingletonsInstantiated方法。

那我们不妨让程序继续往下运行,来验证上面这段话,当程序运行至下面这行代码处时,发现有一个bean实现了SmartInitializingSingleton接口,不然程序是不会进入到if判断语句中的。
image.png
那么,到底是哪一个bean实现了SmartInitializingSingleton接口呢?我们不妨Inspect一下singletonInstance变量的值,这样很快就能知道该bean了,它就是EventListenerMethodProcessor,如下图所示。
image.png
于是,接下来便会执行该bean中的afterSingletonsInstantiated方法,也就是SmartInitializingSingleton接口中定义的方法。

preInstantiateSingletons的出口大门

我们继续让程序往下运行,直至执行完整个for循环,由于IOC容器中的bean还是蛮多的,所以要执行完整个for循环,你得不停地按下F6快捷键。当程序运行至下面这行代码处时,我们发现beanFactory.preInstantiateSingletons()这行代码总算是执行完了。
image.png
还记得这行代码是来干嘛的吗?它是来初始化所有剩下的单实例bean的。
接着,我们继续让程序往下运行,直至运行至下面这行代码处为止,此时,程序来到了Spring IOC容器创建的最后一步了,即完成BeanFactory的初始化创建工作。
image.png
以上该方法一旦执行完,那么Spring IOC容器就创建完成了。接下来,我们就看看finishRefresh方法里面都做了些啥事。