1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
| private <T> T doGetBean(final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly) throws BeansException { // 将传入的name转换为实际的beanName, a -> a ; &a -> a; // 如果该bean类型class是FactoryBean, 无论是getBean(a),还是getBean(&a), // 都是先实例化FactoryBean, 然后再返回实际需要的bean final String beanName = transformedBeanName(name); Object bean; // 先从缓存中获取单例 Object sharedInstance = getSingleton(beanName); // 缓存中存在单例,并且 args 为空(因为只有prototype才能带参数 args),才进入 getObjectForBeanInstance if (sharedInstance != null && args == null) { // 获取实际需要的bean, sharedInstance 可能为 FactoryBean bean = getObjectForBeanInstance(sharedInstance, name, beanName, null); } else { // 检查是否为 当前线程正在创建的prototype 实例 if (isPrototypeCurrentlyInCreation(beanName)) { throw new BeanCurrentlyInCreationException(beanName); } // 检查是否存在当前beanFactory中,不存在则去父工厂(存在的话)中找 BeanFactory parentBeanFactory = getParentBeanFactory(); if (parentBeanFactory != null && !containsBeanDefinition(beanName)) { String nameToLookup = originalBeanName(name); if (args != null) { return (T) parentBeanFactory.getBean(nameToLookup, args); } else { return parentBeanFactory.getBean(nameToLookup, requiredType); } } // 检查是否只是为了类型检查而创建bean, 不是的话将beanName添加到已创建bean容器中 // removeSingletonIfCreatedForTypeCheckOnly() 方法可移除只用来检查类型创建的bean if (!typeCheckOnly) { markBeanAsCreated(beanName); } // 获取合并后的根 BeanDefinition,BeanDefintiton 跟类一样具有继承关系 final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName); checkMergedBeanDefinition(mbd, beanName, args);
// 将依赖的bean提前创建 String[] dependsOn = mbd.getDependsOn(); if (dependsOn != null) { for (String dependsOnBean : dependsOn) { getBean(dependsOnBean); // 注册依赖 bean registerDependentBean(dependsOnBean, beanName); } } // 创建单例实例 if (mbd.isSingleton()) { sharedInstance = getSingleton(beanName, new ObjectFactory() { public Object getObject() throws BeansException { try { // 创建bean return createBean(beanName, mbd, args); } catch (BeansException ex) { destroySingleton(beanName); throw ex; } } }); bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd); } // 创建原型实例 else if (mbd.isPrototype()) { // It's a prototype -> create a new instance. Object prototypeInstance = null; try { beforePrototypeCreation(beanName); prototypeInstance = createBean(beanName, mbd, args); } finally { afterPrototypeCreation(beanName); } bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd); } // 创建自定义Scope实例, CustomScopeConfigurer / SimpleThreadScope else { String scopeName = mbd.getScope(); final Scope scope = this.scopes.get(scopeName); if (scope == null) { throw new IllegalStateException("No Scope registered for scope '" + scopeName + "'"); } try { Object scopedInstance = scope.get(beanName, new ObjectFactory() { public Object getObject() throws BeansException { beforePrototypeCreation(beanName); try { return createBean(beanName, mbd, args); } finally { afterPrototypeCreation(beanName); } } }); bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd); } catch (IllegalStateException ex) {} } }
// 检查获取到的bean与参数 requiredType 是否匹配 if (requiredType != null && bean != null && !requiredType.isAssignableFrom(bean.getClass())) { throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass()); } return (T) bean; }
|