对应源码如下:
protected void autowireByName( String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) { // 得到符合下面条件的属性名称 // 1.有setter方法 // 2.需要进行依赖检查 // 3.不包含在XML配置中 // 4.不是简单类型(基本数据类型,枚举,日期等) // 这里可以看到XML配置优先级高于自动注入的优先级 // 不进行依赖检查的属性,也不会进行属性注入 String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw); for (String propertyName : propertyNames) { if (containsBean(propertyName)) { Object bean = getBean(propertyName); // 将自动注入的属性添加到pvs中去 pvs.add(propertyName, bean); // 注册bean之间的依赖关系 registerDependentBean(propertyName, beanName); // 忽略日志 } // 忽略日志 } }看到了吗?代码就是这么的简单,不是要通过名称注入吗?直接通过beanName调用getBean,完事儿
autowireByType protected void autowireByType( String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) { // 这个类型转换器,主要是在处理@Value时需要使用 TypeConverter converter = getCustomTypeConverter(); if (converter == null) { converter = bw; } Set<String> autowiredBeanNames = new LinkedHashSet<>(4); // 得到符合下面条件的属性名称 // 1.有setter方法 // 2.需要进行依赖检查 // 3.不包含在XML配置中 // 4.不是简单类型(基本数据类型,枚举,日期等) // 这里可以看到XML配置优先级高于自动注入的优先级 String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw); for (String propertyName : propertyNames) { try { PropertyDescriptor pd = bw.getPropertyDescriptor(propertyName); if (Object.class != pd.getPropertyType()) { // 这里获取到的就是setter方法的参数,因为我们需要按照类型进行注入嘛 MethodParameter methodParam = BeanUtils.getWriteMethodParameter(pd); // 如果是PriorityOrdered在进行类型匹配时不会去匹配factoryBean // 如果不是PriorityOrdered,那么在查找对应类型的依赖的时候会会去匹factoryBean // 这就是Spring的一种设计理念,实现了PriorityOrdered接口的Bean被认为是一种 // 最高优先级的Bean,这一类的Bean在进行为了完成装配而去检查类型时, // 不去检查factoryBean // 具体可以参考PriorityOrdered接口上的注释文档 boolean eager = !(bw.getWrappedInstance() instanceof PriorityOrdered); // 将参数封装成为一个依赖描述符 // 依赖描述符会通过:依赖所在的类,字段名/方法名,依赖的具体类型等来描述这个依赖 DependencyDescriptor desc = new AutowireByTypeDependencyDescriptor(methodParam, eager); // 解析依赖,这里会处理@Value注解 // 另外,通过指定的类型到容器中查找对应的bean Object autowiredArgument = resolveDependency(desc, beanName, autowiredBeanNames, converter); if (autowiredArgument != null) { // 将查找出来的依赖属性添加到pvs中,后面会将这个pvs应用到bean上 pvs.add(propertyName, autowiredArgument); } // 注册bean直接的依赖关系 for (String autowiredBeanName : autowiredBeanNames) { registerDependentBean(autowiredBeanName, beanName); if (logger.isDebugEnabled()) { logger.debug("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); } } } resolveDependency这个方法在Spring杂谈 | 什么是ObjectFactory?什么是ObjectProvider?已经做过分析了,本文不再赘述。