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; }
附上流程图: