总体流程
protectedT doGetBean( final String name, final Class requiredType, final Object[] args, boolean typeCheckOnly) throws BeansException { // 1、转换beanName final String beanName = transformedBeanName(name); Object bean; // 2、获取缓存中的singleton类型的实例,也有可能是提早暴露的没有完全初始化的实例 // Eagerly check singleton cache for manually registered singletons. Object sharedInstance = getSingleton(beanName); if (sharedInstance != null && args == null) {// singleton类型的bean,args必须是null,否则报错 2.1 } else { 2.2 } // Check if required type matches the type of the actual bean instance. if (requiredType != null && bean != null && !requiredType.isAssignableFrom(bean.getClass())) { 3 } return (T) bean;}
1、处理beanName
2、获取缓存中的singleton类型的实例,这里有两种情况:
- 已经初始化完成的bean实例,从singletonObjects中获取
bean name --> bean instanceMap
singletonObjects - 提早暴露的正在创建中的bean,没有完全初始化的bean(这个是用来解决循环依赖)
2.1、getSingleton(beanName) 不为空
PS:getBean()的参数arg在singleton类型的bean时必须为null,否则报错。
if (logger.isDebugEnabled()) { if (isSingletonCurrentlyInCreation(beanName)) { logger.debug("Returning eagerly cached instance of singleton bean '" + beanName + "' that is not fully initialized yet - a consequence of a circular reference"); } else { logger.debug("Returning cached instance of singleton bean '" + beanName + "'"); }}// 处理FactoryBean类型bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
2.2、getSingleton(beanName)为空
1、检查prototype类型的bean,如果是循环依赖就报错
if (isPrototypeCurrentlyInCreation(beanName)) { throw new BeanCurrentlyInCreationException(beanName);}
2、如果当前找不到当前bean的BeanDefinition,就从父类BeanFactory中获取
// Check if bean definition exists in this factory.BeanFactory parentBeanFactory = getParentBeanFactory();if (parentBeanFactory != null && !containsBeanDefinition(beanName)) { // Not found -> check parent. String nameToLookup = originalBeanName(name); if (args != null) { // Delegation to parent with explicit args. return (T) parentBeanFactory.getBean(nameToLookup, args); } else { // No args -> delegate to standard getBean method. return parentBeanFactory.getBean(nameToLookup, requiredType); }}
3、获取BeanDefinition
final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);// 如果是singleton类型的bean,args不为null就报错checkMergedBeanDefinition(mbd, beanName, args);
4、处理singleton类型的创建
// Create bean instance.if (mbd.isSingleton()) { sharedInstance = getSingleton(beanName, new ObjectFactory
通过getSingleton()方法,传入ObjectFactory的匿名实现。
4.1、getSingleton()
Assert.notNull(beanName, "'beanName' must not be null");synchronized (this.singletonObjects) { Object singletonObject = this.singletonObjects.get(beanName); if (singletonObject == null) { ... beforeSingletonCreation(beanName); boolean newSingleton = false; boolean recordSuppressedExceptions = (this.suppressedExceptions == null); if (recordSuppressedExceptions) { this.suppressedExceptions = new LinkedHashSet(); } try { singletonObject = singletonFactory.getObject(); newSingleton = true; } ... finally { if (recordSuppressedExceptions) { this.suppressedExceptions = null; } afterSingletonCreation(beanName); } if (newSingleton) { addSingleton(beanName, singletonObject); } } return (singletonObject != NULL_OBJECT ? singletonObject : null);}
总体分为这几步:
- beforeSingletonCreation:将beanName加入到正在创建的集合中
- singletonFactory.getObject():调用之前传入的ObjectFactory实现,进入创建bean的流程n
- afterSingletonCreation:将beanName从正在创建的集合中移除
- addSingleton:加入到缓存中
5、其他类型的不看了
3、对bean类型转换
// Check if required type matches the type of the actual bean instance.if (requiredType != null && bean != null && !requiredType.isAssignableFrom(bean.getClass())) { try { return getTypeConverter().convertIfNecessary(bean, requiredType); } catch (TypeMismatchException ex) { if (logger.isDebugEnabled()) { logger.debug("Failed to convert bean '" + name + "' to required type [" + ClassUtils.getQualifiedName(requiredType) + "]", ex); } throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass()); }}return (T) bean;