doGetBean方法的大致流程
1、通过getSingleton(String beanName, boolean allowEarlyReference)方法从缓存中获取是否存在该bean
2、如果通过getSingleton获取到了bean,那么就会返回该bean。
(1)在返回之前还会把bean交给getObjectForBeanInstance方处理一下,这个方法作用是什么呢?看源码:
protected Object getObjectForBeanInstance(Object beanInstance, String name, String beanName, @Nullable RootBeanDefinition mbd) {
//省略代码......
//判断你的bean是不是FactoryBean,
//如果不是FactoryBean,那么就属于正常的bean实例了,直接返回
if (!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {
return beanInstance;
}
//省略代码......
if (object == null) {
// Return bean instance from factory.
FactoryBean<?> factory = (FactoryBean<?>) beanInstance;
//省略代码......
//你的bean是FactoryBean,那么就会通过FactoryBean的getObject方法获取真正的bean
object = getObjectFromFactoryBean(factory, beanName, !synthetic);
}
return object;
}
看源码就知道,getObjectForBeanInstance就是判断你的bean是不是实现了FactoryBean,如果实现了,则需要调用getObject返回真正的bean。
3、如果通过getSingleton没有获取到bean,那么就会去创建bean,然后注入属性和后置处理等操作。最后返回该bean
创建bean的代码主要在这一段中,
调用getSingleton方法(注意这是重载方法,要和上面的分开,这个的第二个参数是ObjectFactory),
在该getSingleton内
(1)先调用createBean方法去创建bean(注入属性、后置处理器处理都在这里面)。在往该bean注入属性时,如果又需要依赖其他bean,那么此时就会递归调用doGetBean去获取被注入的bean的实例。
(这一步具体方法流程请看另一篇文章:https://blog.csdn.net/qq_36951116/article/details/100032254)
(2)然后把创建完成的bean(已经注入了属性、并被后置处理器等处理完的最终版的bean)通过addSingleton添加到singletonObjects中。(addSingleton方法的作用请看这篇文章:https://blog.csdn.net/qq_36951116/article/details/100030814)
sharedInstance = getSingleton(beanName, () -> {
try {
return createBean(beanName, mbd, args);
}
catch (BeansException ex) {
// Explicitly remove instance from singleton cache: It might have been put there
// eagerly by the creation process, to allow for circular reference resolution.
// Also remove any beans that received a temporary reference to the bean.
destroySingleton(beanName);
throw ex;
}
});