protectedvoidautowireByType(String beanName,AbstractBeanDefinition mbd,BeanWrapper bw,MutablePropertyValues pvs){// 得到类型转化器,默认与BeanWrapper同一个TypeConverter converter =getCustomTypeConverter();if(converter ==null){
converter = bw;}Set<String> autowiredBeanNames =newLinkedHashSet<>(4);// 获取当前Bean中能进行自动注入的属性名String[] propertyNames =unsatisfiedNonSimpleProperties(mbd, bw);for(String propertyName : propertyNames){try{// 获取当前属性的属性描述器PropertyDescriptor pd = bw.getPropertyDescriptor(propertyName);// Don't try autowiring by type for type Object: never makes sense,// even if it technically is a unsatisfied, non-simple property.// 不是Object类型:所有类都是Obj的子类导致选择太多,不知道注入那个Beanif(Object.class!= pd.getPropertyType()){// 得到当前set方法参数信息MethodParameter methodParam =BeanUtils.getWriteMethodParameter(pd);// Do not allow eager init for type matching in case of a prioritized post-processor.// eager表示立即初始化,表示在根据类型查找Bean时,允不允许进行Bean的创建,如果当前bean实现了PriorityOrdered,那么则不允许// 为什么不允许,因为我自己是PriorityOrdered,是优先级最高的,不能有比我创建得更早的boolean eager =!(bw.getWrappedInstance()instanceofPriorityOrdered);// 构建一个依赖描述器DependencyDescriptor desc =newAutowireByTypeDependencyDescriptor(methodParam, eager);// 根据类型找到的结果:比较复杂,在@Autowired中深入分析Object autowiredArgument =resolveDependency(desc, beanName, autowiredBeanNames, converter);// 得到的结果不是null,放入属性对应关系中if(autowiredArgument !=null){
pvs.add(propertyName, autowiredArgument);}// 循环注入到当前bean所依赖的bean,autowiredBeanNames是当前bean锁依赖的bean集合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){thrownewUnsatisfiedDependencyException(mbd.getResourceDescription(), beanName, propertyName, ex);}}}