从缓存获取单例的过程,如果缓存中不存在已经加载的单例bean,就需要从头开始bean的加载过程了,而Spring中使用getSingleton的重载方法实现bean的加载过程。
public Object getSingleton(String beanName, ObjectFactory singletonFactory)
// 全局变量需要同步
// 首先检查对应的bean是否已经加载过,因为singleton模式其实就是复用已创建的bean,所以这一步是必须的
// 如果为空才可以进行singleton的bean的初始化
// 初始化bean
// 加入缓存
}
上述代码中其实是使用回调方法,使得程序可以在单例创建的前后做一些准备及处理操作,而真正的获取单例bena方法其实并不是在此方法中实现的,其实现逻辑是在ObjectFactory类型的实例singletonFactory中实现的,而这些准备及处理操作包括如下内容:
1.检查缓存是否已经加载过了。
2.如没有加载,则记录beanName的正在加载状态。
3.加载单例前记录状态。
ObjectFactory的核心部分其实只是调用了createBean的方法,所以还需要到createBean方法中寻找真理。
getSingleton(beanName,new ObjectFactory< Object>()
// return createBean(beanName,mbd,args)