知识准备:
AbstractBeanFactory.doGetBean方法,创建单例对象的部分代码如下:
if (mbd.isSingleton()) {
sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {
@Override
public Object getObject() throws BeansException {
return createBean(beanName, mbd, args);
} );
bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
}
调用了方法getSingleton()方法,而该方法存在于DefaultSingletonBeanRegistry类中。下图为类的继承关系:
在匿名内部类中调用了createBean()方法,该方法存在于AbstractAutowireCapableBeanFactory类中。继承关系如下:
下面我们具体分析单例对象的创建过程(DefaultSingletonBeanRegistry.getSingleton):
1.从单例缓存中查找bean,能找到直接返回,找不到执行下面步骤
2.单例创建前的前期检查
3.回调匿名内部类的getObject方法,从而调用AbstractAutowireCapableBeanFactory.createBean()
详情点击:AbstractAutowireCapableBeanFactory