spring 单例bean创建粗略流程
getSingleton完成功能
调用createBean方法;并发情况下避免重复创建bean;新增缓存。
注意:getSingleton有3个重名的重载方法,此处的方法是 第二个参数类型是ObjectFactory类型 的方法。
// DefaultSingletonBeanRegistry类中,214行
public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory)
源码
// AbstractBeanFactory类中
// 1、333行:起始调用,spring开始创建bean,接3
sharedInstance = getSingleton(beanName, () -> {......})
// DefaultSingletonBeanRegistry类中
// 2、216行:并发情况控制,避免重复创建,
synchronized (this.singletonObjects) {......}
// 3、227行:在创建单例bean前,检查bean是否正在创建,避免重复创建,接4
beforeSingletonCreation(beanName);
// 4、234行:调用createBean方法,执行创建bean流程,返回创建bean,接5
singletonObject = singletonFactory.getObject();
// 5、257行:创建bean实例后,从 正在创建的bean的set集合中移除beanName,接6
afterSingletonCreation(beanName);
// 6、260行:创建bean成功后,一级缓存中添加缓存、二级缓存中移除缓存、registeredSingletons添加beanName,接7
addSingleton(beanName, singletonObject);
// 7、263行:返回创建的bean实例,结束
return singletonObject;
细节注意
1、这部分源码只是getSingleton方法大体流程,具体请见getBean和createBean流程。
2、步骤3和5中,inCreationCheckExclusions和singletonsCurrentlyInCreation两个属性保证spring不会重复创建bean。
<本人认为只需要一种属性,暂时没有考虑到需要两种属性的情况,待确认>
3、步骤4中调用方法,本质上是调用方法中的第二个参数,lambda表达式,执行createBean方法。