获取bean(doCreateBean)有四步:
createBeanInstance,创建BeanWrapper 
属性填充 
bean初始化 
 
1、属性填充逻辑 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 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121     @SuppressWarnings("deprecation")        protected  void  populateBean (String beanName, RootBeanDefinition mbd, @Nullable  BeanWrapper bw)  {                  if  (bw == null ) {             if  (mbd.hasPropertyValues()) {                                  throw  new  BeanCreationException (                         mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance" );             } else  {                                  return ;             }         }                           boolean  continueWithPropertyPopulation  =  true ;                  if  (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {                          for  (BeanPostProcessor bp : getBeanPostProcessors()) {                                  if  (bp instanceof  InstantiationAwareBeanPostProcessor) {                     InstantiationAwareBeanPostProcessor  ibp  =  (InstantiationAwareBeanPostProcessor) bp;                                                               if  (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {                         continueWithPropertyPopulation = false ;                         break ;                     }                 }             }         }                  if  (!continueWithPropertyPopulation) {             return ;         }                  PropertyValues  pvs  =  (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null );                           if  (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_NAME || mbd.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE) {                                       MutablePropertyValues  newPvs  =  new  MutablePropertyValues (pvs);                                       if  (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_NAME) {                 autowireByName(beanName, mbd, bw, newPvs);             }                                       if  (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE) {                 autowireByType(beanName, mbd, bw, newPvs);             }             pvs = newPvs;         }                  boolean  hasInstAwareBpps  =  hasInstantiationAwareBeanPostProcessors();                  boolean  needsDepCheck  =  (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);         PropertyDescriptor[] filteredPds = null ;                  if  (hasInstAwareBpps) {                          if  (pvs == null ) {                 pvs = mbd.getPropertyValues();             }                          for  (BeanPostProcessor bp : getBeanPostProcessors()) {                                  if  (bp instanceof  InstantiationAwareBeanPostProcessor) {                     InstantiationAwareBeanPostProcessor  ibp  =  (InstantiationAwareBeanPostProcessor) bp;                                          PropertyValues  pvsToUse  =  ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);                     if  (pvsToUse == null ) {                         if  (filteredPds == null ) {                                                                                       filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);                         }                                                  pvsToUse = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);                         if  (pvsToUse == null ) {                             return ;                         }                     }                     pvs = pvsToUse;                 }             }         }                  if  (needsDepCheck) {                          if  (filteredPds == null ) {                                                   filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);             }                                                                                           checkDependencies(beanName, mbd, filteredPds, pvs);         }                  if  (pvs != null ) {                          applyPropertyValues(beanName, mbd, bw, pvs);         }     } 
 
主要流程:
确认是否需要用InstantiationAwareBeanPostProcessors处理bean,可以改变bean,并且可以终止属性的填充。 
自动注入,byType或者byName,最后将属性存储到PropertyValues中。 
InstantiationAwareBeanPostProcessor,对所有需要依赖检查的属性进行后处理。 
依赖检查,对应depends-on,指定Bean初始化及销毁时的顺序 
将PropertyValues应用到BeanWrapper 
 
2、自动注入 涉及到两种:byType与byName注入。
2.1、autowireByName 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     protected  void  autowireByName (String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs)  {                  String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw);                  for  (String propertyName : propertyNames) {                          if  (containsBean(propertyName)) {                                  Object  bean  =  getBean(propertyName);                                  pvs.add(propertyName, bean);                                  registerDependentBean(propertyName, beanName);                 if  (logger.isTraceEnabled()) {                     logger.trace("Added autowiring by name from bean name '"  + beanName +                             "' via property '"  + propertyName + "' to bean named '"  + propertyName + "'" );                 }             } else  {                 if  (logger.isTraceEnabled()) {                     logger.trace("Not autowiring property '"  + propertyName + "' of bean '"  + beanName +                             "' by name: no matching bean found" );                 }             }         }     } 
 
通过unsatisfiedNonSimpleProperties过滤:有可写方法、依赖检测中没有被忽略、不是简单属性类型。这里获取的就是需要依赖注入的属性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22     protected  String[] unsatisfiedNonSimpleProperties(AbstractBeanDefinition mbd, BeanWrapper bw) {         Set<String> result = new  TreeSet <>();                  PropertyValues  pvs  =  mbd.getPropertyValues();                  PropertyDescriptor[] pds = bw.getPropertyDescriptors();         for  (PropertyDescriptor pd : pds) {                                                                                           if  (pd.getWriteMethod() != null  && !isExcludedFromDependencyCheck(pd) && !pvs.contains(pd.getName()) &&                     !BeanUtils.isSimpleProperty(pd.getPropertyType())) {                                  result.add(pd.getName());             }         }         return  StringUtils.toStringArray(result);     } 
 
最后调用registerDependentBean完成注册依赖:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public  void  registerDependentBean (String beanName, String dependentBeanName)  {	String  canonicalName  =  canonicalName(beanName); 	synchronized  (this .dependentBeanMap) { 		Set<String> dependentBeans = 				this .dependentBeanMap.computeIfAbsent(canonicalName, k -> new  LinkedHashSet <>(8 )); 		if  (!dependentBeans.add(dependentBeanName)) { 			return ; 		} 	} 	synchronized  (this .dependenciesForBeanMap) { 		Set<String> dependenciesForBean = 				this .dependenciesForBeanMap.computeIfAbsent(dependentBeanName, k -> new  LinkedHashSet <>(8 )); 		dependenciesForBean.add(canonicalName); 	} } 
 
2.2、autowireByType 定义“按类型自动装配”(按类型定义bean属性)行为的抽象方法。这类似于PicoContainer缺省值,其中bean工厂中必须恰好有一个属性类型的bean。这使得bean工厂很容易配置为较小的名称空间,但对于较大的应用程序,它的工作效果不如标准Spring行为。
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 protected  void  autowireByType (         String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs)  {              TypeConverter  converter  =  getCustomTypeConverter();     if  (converter == null ) {         converter = bw;     }     Set<String> autowiredBeanNames = new  LinkedHashSet <>(4 );          String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw);          for  (String propertyName : propertyNames) {         try  {                          PropertyDescriptor  pd  =  bw.getPropertyDescriptor(propertyName);                          if  (Object.class != pd.getPropertyType()) {                                  MethodParameter  methodParam  =  BeanUtils.getWriteMethodParameter(pd);                                  boolean  eager  =  !PriorityOrdered.class.isInstance(bw.getWrappedInstance());                 DependencyDescriptor  desc  =  new  AutowireByTypeDependencyDescriptor (methodParam, eager);                                  Object  autowiredArgument  =  resolveDependency(desc, beanName, autowiredBeanNames, converter);                 if  (autowiredArgument != null ) {                     pvs.add(propertyName, autowiredArgument);                 }                                  for  (String autowiredBeanName : autowiredBeanNames) {                                          registerDependentBean(autowiredBeanName, beanName);                     if  (logger.isTraceEnabled()) {                         logger.trace("Autowiring by type from bean name '"  + beanName + "' via property '"  +                                 propertyName + "' to bean named '"  + autowiredBeanName + "'" );                     }                 }                 autowiredBeanNames.clear();             }         } catch  (BeansException ex) {             throw  new  UnsatisfiedDependencyException (mbd.getResourceDescription(), beanName, propertyName, ex);         }     } } 
 
首先要找到依赖的属性,之后通过迭代根据类型获取匹配的bean,最后注册依赖。resolveDependency:针对工厂中定义的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 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 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 @Override    @Nullable     public  Object resolveDependency (DependencyDescriptor descriptor, @Nullable  String requestingBeanName,                                     @Nullable  Set<String> autowiredBeanNames, @Nullable  TypeConverter typeConverter)  throws  BeansException {                       descriptor.initParameterNameDiscovery(getParameterNameDiscoverer());                if  (Optional.class == descriptor.getDependencyType()) {            return  createOptionalDependency(descriptor, requestingBeanName);        } else  if  (ObjectFactory.class == descriptor.getDependencyType() ||                ObjectProvider.class == descriptor.getDependencyType()) {                        return  new  DependencyObjectProvider (descriptor, requestingBeanName);        } else  if  (javaxInjectProviderClass == descriptor.getDependencyType()) {                        return  new  Jsr330Factory ().createDependencyProvider(descriptor, requestingBeanName);        } else  {                        Object  result  =  getAutowireCandidateResolver().getLazyResolutionProxyIfNecessary(                    descriptor, requestingBeanName);            if  (result == null ) {                                result = doResolveDependency(descriptor, requestingBeanName, autowiredBeanNames, typeConverter);            }            return  result;        }    }    @Nullable     public  Object doResolveDependency (DependencyDescriptor descriptor, @Nullable  String beanName,                                       @Nullable  Set<String> autowiredBeanNames, @Nullable  TypeConverter typeConverter)  throws  BeansException {               InjectionPoint  previousInjectionPoint  =  ConstructorResolver.setCurrentInjectionPoint(descriptor);        try  {                                                Object  shortcut  =  descriptor.resolveShortcut(this );            if  (shortcut != null ) {                return  shortcut;            }                        Class<?> type = descriptor.getDependencyType();                                                Object  value  =  getAutowireCandidateResolver().getSuggestedValue(descriptor);            if  (value != null ) {                                if  (value instanceof  String) {                    String  strVal  =  resolveEmbeddedValue((String) value);                    BeanDefinition  bd  =  (beanName != null  && containsBean(beanName) ?                            getMergedBeanDefinition(beanName) : null );                                        value = evaluateBeanDefinitionString(strVal, bd);                }                TypeConverter  converter  =  (typeConverter != null  ? typeConverter : getTypeConverter());                try  {                    return  converter.convertIfNecessary(value, type, descriptor.getTypeDescriptor());                } catch  (UnsupportedOperationException ex) {                                        return  (descriptor.getField() != null  ?                            converter.convertIfNecessary(value, type, descriptor.getField()) :                            converter.convertIfNecessary(value, type, descriptor.getMethodParameter()));                }            }                        Object  multipleBeans  =  resolveMultipleBeans(descriptor, beanName, autowiredBeanNames, typeConverter);            if  (multipleBeans != null ) {                return  multipleBeans;            }                                    Map<String, Object> matchingBeans = findAutowireCandidates(beanName, type, descriptor);            if  (matchingBeans.isEmpty()) {                                if  (isRequired(descriptor)) {                                        raiseNoMatchingBeanFound(type, descriptor.getResolvableType(), descriptor);                }                return  null ;            }            String autowiredBeanName;            Object instanceCandidate;            if  (matchingBeans.size() > 1 ) {                                autowiredBeanName = determineAutowireCandidate(matchingBeans, descriptor);                if  (autowiredBeanName == null ) {                    if  (isRequired(descriptor) || !indicatesMultipleBeans(type)) {                                                return  descriptor.resolveNotUnique(descriptor.getResolvableType(), matchingBeans);                    } else  {                                                                                                return  null ;                    }                }                instanceCandidate = matchingBeans.get(autowiredBeanName);            } else  {                                Map.Entry<String, Object> entry = matchingBeans.entrySet().iterator().next();                autowiredBeanName = entry.getKey();                instanceCandidate = entry.getValue();            }            if  (autowiredBeanNames != null ) {                autowiredBeanNames.add(autowiredBeanName);            }            if  (instanceCandidate instanceof  Class) {                instanceCandidate = descriptor.resolveCandidate(autowiredBeanName, type, this );            }            Object  result  =  instanceCandidate;            if  (result instanceof  NullBean) {                if  (isRequired(descriptor)) {                    raiseNoMatchingBeanFound(type, descriptor.getResolvableType(), descriptor);                }                result = null ;            }            if  (!ClassUtils.isAssignableValue(type, result)) {                throw  new  BeanNotOfRequiredTypeException (autowiredBeanName, type, instanceCandidate.getClass());            }            return  result;        } finally  {            ConstructorResolver.setCurrentInjectionPoint(previousInjectionPoint);        }    } 
 
至此,完成了所以注入属性的获取,但是并没有应用到实例化的bean中,方法applyPropertyValues则完成这一步:
3、applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs) 应用给定的属性值,解析此bean工厂中对其他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 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 protected  void  applyPropertyValues (String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs)  {         if  (pvs.isEmpty()) {         return ;     }     if  (System.getSecurityManager() != null  && bw instanceof  BeanWrapperImpl) {         ((BeanWrapperImpl) bw).setSecurityContext(getAccessControlContext());     }     MutablePropertyValues  mpvs  =  null ;     List<PropertyValue> original;          if  (pvs instanceof  MutablePropertyValues) {         mpvs = (MutablePropertyValues) pvs;         if  (mpvs.isConverted()) {                          try  {                                  bw.setPropertyValues(mpvs);                 return ;             } catch  (BeansException ex) {                 throw  new  BeanCreationException (                         mbd.getResourceDescription(), beanName, "Error setting property values" , ex);             }         }         original = mpvs.getPropertyValueList();     } else  {                  original = Arrays.asList(pvs.getPropertyValues());     }     TypeConverter  converter  =  getCustomTypeConverter();     if  (converter == null ) {         converter = bw;     }     BeanDefinitionValueResolver  valueResolver  =  new  BeanDefinitionValueResolver (this , beanName, mbd, converter);          List<PropertyValue> deepCopy = new  ArrayList <>(original.size());     boolean  resolveNecessary  =  false ;     for  (PropertyValue pv : original) {         if  (pv.isConverted()) {             deepCopy.add(pv);         } else  {             String  propertyName  =  pv.getName();             Object  originalValue  =  pv.getValue();             Object  resolvedValue  =  valueResolver.resolveValueIfNecessary(pv, originalValue);             Object  convertedValue  =  resolvedValue;             boolean  convertible  =  bw.isWritableProperty(propertyName) &&                     !PropertyAccessorUtils.isNestedOrIndexedProperty(propertyName);             if  (convertible) {                 convertedValue = convertForProperty(resolvedValue, propertyName, bw, converter);             }                                       if  (resolvedValue == originalValue) {                 if  (convertible) {                     pv.setConvertedValue(convertedValue);                 }                 deepCopy.add(pv);             } else  if  (convertible && originalValue instanceof  TypedStringValue &&                     !((TypedStringValue) originalValue).isDynamic() &&                     !(convertedValue instanceof  Collection || ObjectUtils.isArray(convertedValue))) {                 pv.setConvertedValue(convertedValue);                 deepCopy.add(pv);             } else  {                 resolveNecessary = true ;                 deepCopy.add(new  PropertyValue (pv, convertedValue));             }         }     }     if  (mpvs != null  && !resolveNecessary) {         mpvs.setConverted();     }          try  {         bw.setPropertyValues(new  MutablePropertyValues (deepCopy));     } catch  (BeansException ex) {         throw  new  BeanCreationException (                 mbd.getResourceDescription(), beanName, "Error setting property values" , ex);     } } 
 
分析到这里,即属性已经填充到了BeanWrapper中了,之后分析bean初始化。