Spring源码学习(七)

Spring源码学习之心情不太好

Posted by GuiLing on August 20, 2019

Spring源码解析(七)

上一篇文章说到了Bean创建过程中的**getSingleton(beanName)**方法,接着上次的说。

调用完**getSingleton(beanName)** 方法后如果放回为不空,也就是说当前Bean已经被创建过,然后会对返回的Bean进行检查。

img

在getObjectForBeanInstance(sharedInstance,name,beanName,null);中主要是对从getSingleton中返回的Bean做一些检查。

如果当前获得的Bean不是一个FactoryBean的话则不做任何的处理,直接将其返回:

img

如果当前Bean是一个FactoryBean首先会尝试从从缓存中获取这个FactoryBean的实例,如果缓存中没有,将会把获取这个FactoryBean的任务委托给getObjectFromFactoryBean()这个方法。

img

在这个方法中,仍然是先去缓存中获取FactoryBean,若果为空的话,会调用doGetObjectFromFactoryBean(factory, beanName);方法,这个在之前说过,所有的实际操作都是在do开头的方法中完成的。

img在doGetObjectFromFactoryBean(factory, beanName);方法中调用了FactoryBean接口的getObject方法创建并返回了真正的Bean实例。

    以上这些都是在**getSingleton(beanName)**的返回值不为空的情况下。

    如果**getSingleton(beanName)中放回为空,则要进入创建Bean的过程:**

img首先判断当前Bean是否已经处于创建状态,如果已经处于创建状态则抛出异常,如果没有则首先尝试获取当前Bean的父类工厂,从父工厂中获得Bean,这里一般父工厂为空。然后将当前Bean的状态标记为正在创建。让后获取当前Bean的定义信息,判断当前Bean是否是一个单例Bean,若果是单例则调用CreateBean创建Bean。

img