1判断类型 注入的属性判断其类型:OptionalObjectFactoryObjectProviderjavax。inject。ProviderpublicclassDefaultListableBeanFactoryextendsAbstractAutowireCapableBeanFactoryimplementsConfigurableListableBeanFactory,BeanDefinitionRegistry,Serializable{privatestaticClasslt;?javaxInjectProviderClass;static{try{javaxInjectProviderClassClassUtils。forName(javax。inject。Provider,DefaultListableBeanFactory。class。getClassLoader());}catch(ClassNotFoundExceptionex){javaxInjectProviderClassnull;}}publicObjectresolveDependency(DependencyDescriptordescriptor,NullableStringrequestingBeanName,NullableSetStringautowiredBeanNames,NullableTypeConvertertypeConverter)throwsBeansException{if(Optional。classdescriptor。getDependencyType()){returncreateOptionalDependency(descriptor,requestingBeanName);}elseif(ObjectFactory。classdescriptor。getDependencyType()ObjectProvider。classdescriptor。getDependencyType()){returnnewDependencyObjectProvider(descriptor,requestingBeanName);}elseif(javaxInjectProviderClassdescriptor。getDependencyType()){returnnewJsr330Factory()。createDependencyProvider(descriptor,requestingBeanName);}else{判断是否有Lazy注解,如果有该注解那么会创建代理对象,否则返回null总结:如果注入的属性有Lazy注解,那么会返回由ProxyFactory对象创建的代理对象ObjectresultgetAutowireCandidateResolver()。getLazyResolutionProxyIfNecessary(descriptor,requestingBeanName);if(resultnull){解析查找依赖注入的对象resultdoResolveDependency(descriptor,requestingBeanName,autowiredBeanNames,typeConverter);}returnresult;}}}2查找依赖对象publicclassDefaultListableBeanFactoryextendsAbstractAutowireCapableBeanFactoryimplementsConfigurableListableBeanFactory,BeanDefinitionRegistry,Serializable{publicObjectdoResolveDependency(DependencyDescriptordescriptor,NullableStringbeanName,NullableSetStringautowiredBeanNames,NullableTypeConvertertypeConverter)throwsBeansException{InjectionPointpreviousInjectionPointConstructorResolver。setCurrentInjectionPoint(descriptor);try{Objectshortcutdescriptor。resolveShortcut(this);if(shortcut!null){returnshortcut;}Classlt;?typedescriptor。getDependencyType();判断需要注入的类型是否是一个集合(如何:ListUsersbeans)2。1ObjectmultipleBeansresolveMultipleBeans(descriptor,beanName,autowiredBeanNames,typeConverter);if(multipleBeans!null){returnmultipleBeans;}查找与所需类型匹配的bean实例2。2MapString,ObjectmatchingBeansfindAutowireCandidates(beanName,type,descriptor);if(matchingBeans。isEmpty()){if(isRequired(descriptor)){raiseNoMatchingBeanFound(type,descriptor。getResolvableType(),descriptor);}returnnull;}StringautowiredBeanName;ObjectinstanceCandidate;如果找到多个if(matchingBeans。size()1){在这里会判断多个Bean中是否有一个Primary注解的Bean如果没有Primary,继续获取是否有Priority(优先级)注解如果没有则返回null,如果有则返回值越小的优先级越高(如果有多个优先级一样,则系统报错)如果上面都返回的null,那么最后会通过beanName进行匹配autowiredBeanNamedetermineAutowireCandidate(matchingBeans,descriptor);if(autowiredBeanNamenull){if(isRequired(descriptor)!indicatesMultipleBeans(type)){如果是必须的或者不是集合类型的Bean注入;那么这里抛出异常returndescriptor。resolveNotUnique(descriptor。getResolvableType(),matchingBeans);}else{returnnull;}}instanceCandidatematchingBeans。get(autowiredBeanName);}else{Wehaveexactlyonematch。Map。EntryString,ObjectentrymatchingBeans。entrySet()。iterator()。next();autowiredBeanNameentry。getKey();instanceCandidateentry。getValue();}if(autowiredBeanNames!null){autowiredBeanNames。add(autowiredBeanName);}if(instanceCandidateinstanceofClass){instanceCandidatedescriptor。resolveCandidate(autowiredBeanName,type,this);}ObjectresultinstanceCandidate;if(resultinstanceofNullBean){if(isRequired(descriptor)){raiseNoMatchingBeanFound(type,descriptor。getResolvableType(),descriptor);}resultnull;}if(!ClassUtils。isAssignableValue(type,result)){thrownewBeanNotOfRequiredTypeException(autowiredBeanName,type,instanceCandidate。getClass());}returnresult;}finally{ConstructorResolver。setCurrentInjectionPoint(previousInjectionPoint);}}}2。1判断集合类型 判断需要注入的属性的数据类型是否是如下几种。StreamDependencyDescriptorArrayCollectionMappublicclassDefaultListableBeanFactoryextendsAbstractAutowireCapableBeanFactoryimplementsConfigurableListableBeanFactory,BeanDefinitionRegistry,Serializable{privateObjectresolveMultipleBeans(DependencyDescriptordescriptor,NullableStringbeanName,NullableSetStringautowiredBeanNames,NullableTypeConvertertypeConverter){Classlt;?typedescriptor。getDependencyType();if(descriptorinstanceofStreamDependencyDescriptor){MapString,ObjectmatchingBeansfindAutowireCandidates(beanName,type,descriptor);if(autowiredBeanNames!null){autowiredBeanNames。addAll(matchingBeans。keySet());}StreamObjectstreammatchingBeans。keySet()。stream()。map(namedescriptor。resolveCandidate(name,type,this))。filter(bean!(beaninstanceofNullBean));if(((StreamDependencyDescriptor)descriptor)。isOrdered()){streamstream。sorted(adaptOrderComparator(matchingBeans));}returnstream;}elseif(type。isArray()){Classlt;?componentTypetype。getComponentType();ResolvableTyperesolvableTypedescriptor。getResolvableType();Classlt;?resolvedArrayTyperesolvableType。resolve(type);if(resolvedArrayType!type){componentTyperesolvableType。getComponentType()。resolve();}if(componentTypenull){returnnull;}MapString,ObjectmatchingBeansfindAutowireCandidates(beanName,componentType,newMultiElementDescriptor(descriptor));if(matchingBeans。isEmpty()){returnnull;}if(autowiredBeanNames!null){autowiredBeanNames。addAll(matchingBeans。keySet());}TypeConverterconverter(typeConverter!null?typeConverter:getTypeConverter());Objectresultconverter。convertIfNecessary(matchingBeans。values(),resolvedArrayType);if(resultinstanceofObject〔〕){ComparatorObjectcomparatoradaptDependencyComparator(matchingBeans);if(comparator!null){Arrays。sort((Object〔〕)result,comparator);}}returnresult;}elseif(Collection。class。isAssignableFrom(type)type。isInterface()){Classlt;?elementTypedescriptor。getResolvableType()。asCollection()。resolveGeneric();if(elementTypenull){returnnull;}MapString,ObjectmatchingBeansfindAutowireCandidates(beanName,elementType,newMultiElementDescriptor(descriptor));if(matchingBeans。isEmpty()){returnnull;}if(autowiredBeanNames!null){autowiredBeanNames。addAll(matchingBeans。keySet());}TypeConverterconverter(typeConverter!null?typeConverter:getTypeConverter());Objectresultconverter。convertIfNecessary(matchingBeans。values(),type);if(resultinstanceofList){if(((Listlt;?)result)。size()1){ComparatorObjectcomparatoradaptDependencyComparator(matchingBeans);if(comparator!null){((Listlt;?)result)。sort(comparator);}}}returnresult;}elseif(Map。classtype){ResolvableTypemapTypedescriptor。getResolvableType()。asMap();Classlt;?keyTypemapType。resolveGeneric(0);if(String。class!keyType){returnnull;}Classlt;?valueTypemapType。resolveGeneric(1);if(valueTypenull){returnnull;}MapString,ObjectmatchingBeansfindAutowireCandidates(beanName,valueType,newMultiElementDescriptor(descriptor));if(matchingBeans。isEmpty()){returnnull;}if(autowiredBeanNames!null){autowiredBeanNames。addAll(matchingBeans。keySet());}returnmatchingBeans;}else{returnnull;}}}2。2查找BeanpublicclassDefaultListableBeanFactoryextendsAbstractAutowireCapableBeanFactoryimplementsConfigurableListableBeanFactory,BeanDefinitionRegistry,Serializable{protectedMapString,ObjectfindAutowireCandidates(NullableStringbeanName,Classlt;?requiredType,DependencyDescriptordescriptor){通过类型获取指定类型的BeanString〔〕candidateNamesBeanFactoryUtils。beanNamesForTypeIncludingAncestors(this,requiredType,true,descriptor。isEager());MapString,ObjectresultCollectionUtils。newLinkedHashMap(candidateNames。length);resolvableDependencies集合中保存了,容器内置的和自定义注册的依赖注入对象(如:HttpServletRequest对象的注入为该集合内部指定的对象)for(Map。EntryClasslt;?,ObjectclassObjectEntry:this。resolvableDependencies。entrySet()){Classlt;?autowiringTypeclassObjectEntry。getKey();if(autowiringType。isAssignableFrom(requiredType)){ObjectautowiringValueclassObjectEntry。getValue();autowiringValueAutowireUtils。resolveAutowiringValue(autowiringValue,requiredType);if(requiredType。isInstance(autowiringValue)){result。put(ObjectUtils。identityToString(autowiringValue),autowiringValue);break;}}}for(Stringcandidate:candidateNames){判断是否自己引用自己if(!isSelfReference(beanName,candidate)isAutowireCandidate(candidate,descriptor)){addCandidateEntry(result,candidate,descriptor,requiredType);}}if(result。isEmpty()){booleanmultipleindicatesMultipleBeans(requiredType);Considerfallbackmatchesifthefirstpassfailedtofindanything。。。DependencyDescriptorfallbackDescriptordescriptor。forFallbackMatch();for(Stringcandidate:candidateNames){if(!isSelfReference(beanName,candidate)isAutowireCandidate(candidate,fallbackDescriptor)(!multiplegetAutowireCandidateResolver()。hasQualifier(descriptor))){addCandidateEntry(result,candidate,descriptor,requiredType);}}if(result。isEmpty()!multiple){Considerselfreferencesasafinalpass。。。butinthecaseofadependencycollection,nottheverysamebeanitself。for(Stringcandidate:candidateNames){if(isSelfReference(beanName,candidate)(!(descriptorinstanceofMultiElementDescriptor)!beanName。equals(candidate))isAutowireCandidate(candidate,fallbackDescriptor)){addCandidateEntry(result,candidate,descriptor,requiredType);}}}}returnresult;}} 以上就是Spring在注入属性的时候会判断是什么数据类型进行相应的操作 完毕!!! 公众:SpringBootCloud实战案例锦集 SpringRetry重试框架的应用 SpringBootWebFlux整合SpringSecurity进行权限认证 SpringMVC异常处理方式Spring事务实现原理源码分析 Spring容器这些扩展点你都清楚了吗? Spring自定义Advisor以编程的方式实现AOP SpringBoot邮件发送示例 SpringBoot多数据源配置详解 SpringBoot配置文件你了解多少? 在SpringCloud中你还在使用Ribbon快来试试LoadBalancer