JavaWeb学习笔记(二十二) Spring源码学习的一些理解

本篇文章不具体针对源码进行解析,只是指出其背后的逻辑,便于理解Spring框架内部的机制。

一. getBean()背后发生的事情

  1. 执行流程

建议:这部分逻辑可以对照着源码进行梳理
JavaWeb学习笔记(二十二) Spring源码学习的一些理解

  1. 源码跟踪

参考田小波博客
JavaWeb学习笔记(二十二) Spring源码学习的一些理解

  1. 梳理流程

这里介绍一下上面这张图,一开始流程图只有一条执行路径用来获取bean,这里的getBean是一个空壳方法,里面调用了doGetBean()方法。doGetBean调用getSingleton(beanName)方法获取shareInstance。此后分出两条执行路线,分别为图中的绿色和红色。若shareIntance不为空,就说明缓存中存在该bean对象,然后电泳下面最长的那个方法进行后续的处理。反之说明没有这个bean对象,需要创建这个对象,也就是图中红色的部分。虚线代表geiSingleton()方法内部调用的方法。先通过getObject()方法创建singletonObject对象,然后将该对象添加到缓存中。最右边的几个方法是geiObject()方法调用的方法,createbean()同样也是一个空壳方法,其调用了doCreateBean()方法。通过调用createBeanInstance()方法创建了一个原始的对象(也就是没有注入属性的对象),随后调用addSingletonFactory()方法向缓存中添加单例bean工厂,从该工厂中可以获取到原始对象的引用(即早期引用)。再之后,调用popolateBean()方法添加属性。
其中蓝色的框代表读取/添加缓存的方法