首页 > spring > spring doGetBean源码分析

spring doGetBean源码分析

作者:bin

AbstractBeanFactory.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;
}

附上流程图:

您必须 [ 登录 ] 才能发表留言!