spring doGetBean源码分析
作者:binAbstractBeanFactory.doGetBean();
protected T doGetBean(final String name, @Nullable final Class requiredType,
@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
...
// 判断单例模式下面,是否已存在bean,存在即直接返回
Object sharedInstance = getSingleton(beanName);
if (sharedInstance != null && args == null) {
...
//通过bean实例获取bean返回
bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
}
else {
...
//如果有父级beanFactory,就从尝试从父级beanFactory加载当前bean,此为递归
BeanFactory parentBeanFactory = getParentBeanFactory();
if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
...
}
try {
...
//查看当前bean是否存在其他bean依赖,依赖就先加强其他bean
String[] dependsOn = mbd.getDependsOn();
if (dependsOn != null) {
...
}
// 单利模式创建
if (mbd.isSingleton()) {
...
//通过bean实例获取bean返回
bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
}
//原型模式创建
else if (mbd.isPrototype()) {
...
//通过bean实例获取bean返回
bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
}
else {
//其他如何Request等,创建
String scopeName = mbd.getScope();
final Scope scope = this.scopes.get(scopeName);
...
try {
...
//通过bean实例获取bean返回
bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
}
}
}
}
// 如果是require,但是没有可用等bean,就抛出异常
if (requiredType != null && !requiredType.isInstance(bean)) {
...
}
return (T) bean;
}
附上流程图:
