Spring源码学习(六)

Spring源码学习之贼啦啦滴溜

Posted by GuiLing on August 14, 2019

Spring源码解析(六)

- 上一篇已经进行了BeanPostProcessor的注册,接下来先跳过中间几个不太重要的步骤,直接来到Bean的创建过程。

img

进入初始化Bean的方法中首先给BeanFactory设置了一系列的服务组件,主要的方法其实是最后一个调用

img

从方法名可以大致看出是预实例化单实例Beanimg

首先通过BeanName获取到Bean的定义信息,如果有父类,则会将子类和父类的定义信息进行合并,然后调用getBean方法获取Bean的实例,这里获取Bean的实例又分为两种情况。第一,若果当前Bean是一个工厂Bean的话会在BeanName前添加一个&符号,这是调用getBean方法获取到的Bean其实并不是工厂Bean本身,而是工厂Bean中getObject()方法的返回值类型的Bean。第二,如果当前Bean不是一个工厂Bean将会直接调用getBean方法获得Bean。

img

getBean方法调用了doGetBean(由后面可知在Spring中真正做事的方法都是以do开头的)

img

首先通过转化获得了BeanName,让后调用了getSingleton(beanName)方法,

- singletongObjeces是缓存的所有的单实例bean,以保证单实例bean只会创建一个

- earlySingetonObjects是提前暴露的Bean,在循环依赖的情况下当一个Bean被放入这里后当它还在创建时就可以通过getBean获得了

- singletonFactories是存放ObjectiFactory的存放的是BeanName和BeanFactory的对应关系

img