继续分析Bean的加载:
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
   |             if (isPrototypeCurrentlyInCreation(beanName)) {                throw new BeanCurrentlyInCreationException(beanName);            }
                         BeanFactory parentBeanFactory = getParentBeanFactory();                        if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {                                                String nameToLookup = originalBeanName(name);                                if (parentBeanFactory instanceof AbstractBeanFactory) {                                        return ((AbstractBeanFactory) parentBeanFactory).doGetBean(                            nameToLookup, requiredType, args, typeCheckOnly);                } else if (args != null) {                                        return (T) parentBeanFactory.getBean(nameToLookup, args);                } else if (requiredType != null) {                                        return parentBeanFactory.getBean(nameToLookup, requiredType);                } else {                                        return (T) parentBeanFactory.getBean(nameToLookup);                }            }
                         if (!typeCheckOnly) {                                markBeanAsCreated(beanName);            }
 
 
  | 
 
1、检测
在上一篇文章中分析到,尝试从单例缓存中获取原始实例时,通过判断集合Set singletonsCurrentlyInCreation中是否正在创建这个bean,并解决循环依赖。
原型模式的循环依赖则直接抛出BeanCurrentlyInCreationException,是通过判断ThreadLocal
1 2 3 4 5 6 7 8 9 10 11 12 13
   |  if (isPrototypeCurrentlyInCreation(beanName)) {     throw new BeanCurrentlyInCreationException(beanName); }
      protected boolean isPrototypeCurrentlyInCreation(String beanName) {         Object curVal = this.prototypesCurrentlyInCreation.get();         return (curVal != null &&                 (curVal.equals(beanName) || (curVal instanceof Set && ((Set<?>) curVal).contains(beanName))));     }
      private final ThreadLocal<Object> prototypesCurrentlyInCreation =             new NamedThreadLocal<>("Prototype beans currently in creation");
 
  | 
 
2、父类BeanFactory
首先检查当前的工厂中是否存在此bean的BeanDefinition,如果不存在的话,从父类BeanFactory中获取。
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
   |               BeanFactory parentBeanFactory = getParentBeanFactory();                          if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {                                                   String nameToLookup = originalBeanName(name);                                  if (parentBeanFactory instanceof AbstractBeanFactory) {                                          return ((AbstractBeanFactory) parentBeanFactory).doGetBean(                             nameToLookup, requiredType, args, typeCheckOnly);                 } else if (args != null) {                                          return (T) parentBeanFactory.getBean(nameToLookup, args);                 } else if (requiredType != null) {                                          return parentBeanFactory.getBean(nameToLookup, requiredType);                 } else {                                          return (T) parentBeanFactory.getBean(nameToLookup);                 }             }     
 
 
 
 
 
 
      protected abstract boolean containsBeanDefinition(String beanName);
      protected String originalBeanName(String name) {                  String beanName = transformedBeanName(name);                  if (name.startsWith(FACTORY_BEAN_PREFIX)) {             beanName = FACTORY_BEAN_PREFIX + beanName;         }         return beanName;     }
   | 
 
最终都是委托给父类BeanFactory的getBean处理了。
3、类型检查
1 2 3 4 5
   |   if (!typeCheckOnly) {          markBeanAsCreated(beanName); }
   | 
 
如果是创建bean,需要标记一下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
   |  private final Set<String> alreadyCreated = Collections.newSetFromMap(new ConcurrentHashMap<>(256));
  private final Map<String, RootBeanDefinition> mergedBeanDefinitions = new ConcurrentHashMap<>(256);
  protected void markBeanAsCreated(String beanName) {                  if (!this.alreadyCreated.contains(beanName)) {                          synchronized (this.mergedBeanDefinitions) {                                  if (!this.alreadyCreated.contains(beanName)) {                                                               clearMergedBeanDefinition(beanName); 					                     this.alreadyCreated.add(beanName);                 }             }         }     }
 
  | 
 
