范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Spring注入属性时到底都能注入什么样的数据类型你都知道吗?

  1 判断类型
  注入的属性判断其类型: Optional ObjectFactory ObjectProvider javax.inject.Provider public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {     private static Class<?> javaxInjectProviderClass;      static {         try {             javaxInjectProviderClass =                     ClassUtils.forName("javax.inject.Provider", DefaultListableBeanFactory.class.getClassLoader());         } catch (ClassNotFoundException ex) {             javaxInjectProviderClass = null;         }     }     public Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName,             @Nullable Set autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException {         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 {             // 判断是否有@Lazy注解,如果有该注解那么会创建代理对象,否则返回null             // 总结:如果注入的属性有@Lazy注解,那么会返回由ProxyFactory对象创建的代理对象             Object result = getAutowireCandidateResolver().getLazyResolutionProxyIfNecessary(descriptor, requestingBeanName);             if (result == null) {                 // 解析查找依赖注入的对象                 result = doResolveDependency(descriptor, requestingBeanName, autowiredBeanNames, typeConverter);             }             return result;         }     } }2 查找依赖对象public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {     public Object doResolveDependency(DependencyDescriptor descriptor, @Nullable String beanName,             @Nullable Set 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();              // 判断需要注入的类型是否是一个集合(如何:List beans)             // 2.1              Object multipleBeans = resolveMultipleBeans(descriptor, beanName, autowiredBeanNames, typeConverter);             if (multipleBeans != null) {                 return multipleBeans;             }             // 查找与所需类型匹配的bean实例             // 2.2             Map 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) {                 // 在这里会判断多个Bean中是否有一个@Primary注解的Bean                 // 如果没有@Primary,继续获取是否有@Priority(优先级)注解                 // 如果没有则返回null,如果有则返回值越小的优先级越高(如果有多个优先级一样,则系统报错)                 // 如果上面都返回的null,那么最后会通过beanName进行匹配                 autowiredBeanName = determineAutowireCandidate(matchingBeans, descriptor);                 if (autowiredBeanName == null) {                     if (isRequired(descriptor) || !indicatesMultipleBeans(type)) {                         // 如果是必须的 或者 不是集合类型的Bean注入;那么这里抛出异常                         return descriptor.resolveNotUnique(descriptor.getResolvableType(), matchingBeans);                     } else {                         return null;                     }                 }                 instanceCandidate = matchingBeans.get(autowiredBeanName);             } else {                 // We have exactly one match.                 Map.Entry 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);         }     } }2.1 判断集合类型
  判断需要注入的属性的数据类型是否是如下几种。 StreamDependencyDescriptor Array Collection Map public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {     private Object resolveMultipleBeans(DependencyDescriptor descriptor, @Nullable String beanName,             @Nullable Set autowiredBeanNames, @Nullable TypeConverter typeConverter) {          Class<?> type = descriptor.getDependencyType();          if (descriptor instanceof StreamDependencyDescriptor) {             Map matchingBeans = findAutowireCandidates(beanName, type, descriptor);             if (autowiredBeanNames != null) {                 autowiredBeanNames.addAll(matchingBeans.keySet());             }             Stream stream = matchingBeans.keySet().stream()                     .map(name -> descriptor.resolveCandidate(name, type, this))                     .filter(bean -> !(bean instanceof NullBean));             if (((StreamDependencyDescriptor) descriptor).isOrdered()) {                 stream = stream.sorted(adaptOrderComparator(matchingBeans));             }             return stream;         } else if (type.isArray()) {             Class<?> componentType = type.getComponentType();             ResolvableType resolvableType = descriptor.getResolvableType();             Class<?> resolvedArrayType = resolvableType.resolve(type);             if (resolvedArrayType != type) {                 componentType = resolvableType.getComponentType().resolve();             }             if (componentType == null) {                 return null;             }             Map matchingBeans = findAutowireCandidates(beanName, componentType,                     new MultiElementDescriptor(descriptor));             if (matchingBeans.isEmpty()) {                 return null;             }             if (autowiredBeanNames != null) {                 autowiredBeanNames.addAll(matchingBeans.keySet());             }             TypeConverter converter = (typeConverter != null ? typeConverter : getTypeConverter());             Object result = converter.convertIfNecessary(matchingBeans.values(), resolvedArrayType);             if (result instanceof Object[]) {                 Comparator comparator = adaptDependencyComparator(matchingBeans);                 if (comparator != null) {                     Arrays.sort((Object[]) result, comparator);                 }             }             return result;         } else if (Collection.class.isAssignableFrom(type) && type.isInterface()) {             Class<?> elementType = descriptor.getResolvableType().asCollection().resolveGeneric();             if (elementType == null) {                 return null;             }             Map matchingBeans = findAutowireCandidates(beanName, elementType,                     new MultiElementDescriptor(descriptor));             if (matchingBeans.isEmpty()) {                 return null;             }             if (autowiredBeanNames != null) {                 autowiredBeanNames.addAll(matchingBeans.keySet());             }             TypeConverter converter = (typeConverter != null ? typeConverter : getTypeConverter());             Object result = converter.convertIfNecessary(matchingBeans.values(), type);             if (result instanceof List) {                 if (((List<?>) result).size() > 1) {                     Comparator comparator = adaptDependencyComparator(matchingBeans);                     if (comparator != null) {                         ((List<?>) result).sort(comparator);                     }                 }             }             return result;         } else if (Map.class == type) {             ResolvableType mapType = descriptor.getResolvableType().asMap();             Class<?> keyType = mapType.resolveGeneric(0);             if (String.class != keyType) {                 return null;             }             Class<?> valueType = mapType.resolveGeneric(1);             if (valueType == null) {                 return null;             }             Map matchingBeans = findAutowireCandidates(beanName, valueType,                     new MultiElementDescriptor(descriptor));             if (matchingBeans.isEmpty()) {                 return null;             }             if (autowiredBeanNames != null) {                 autowiredBeanNames.addAll(matchingBeans.keySet());             }             return matchingBeans;         } else {             return null;         }     } }2.2 查找Beanpublic class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {     protected Map findAutowireCandidates(             @Nullable String beanName, Class<?> requiredType, DependencyDescriptor descriptor) {         // 通过类型获取指定类型的Bean         String[] candidateNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(                 this, requiredType, true, descriptor.isEager());         Map result = CollectionUtils.newLinkedHashMap(candidateNames.length);         // resolvableDependencies 集合中保存了,容器内置的和自定义注册的依赖注入对象         //(如:HttpServletRequest对象的注入为该集合内部指定的对象)         for (Map.Entry, Object> classObjectEntry : this.resolvableDependencies.entrySet()) {             Class<?> autowiringType = classObjectEntry.getKey();             if (autowiringType.isAssignableFrom(requiredType)) {                 Object autowiringValue = classObjectEntry.getValue();                 autowiringValue = AutowireUtils.resolveAutowiringValue(autowiringValue, requiredType);                 if (requiredType.isInstance(autowiringValue)) {                     result.put(ObjectUtils.identityToString(autowiringValue), autowiringValue);                     break;                 }             }         }         for (String candidate : candidateNames) {             // 判断是否自己引用自己             if (!isSelfReference(beanName, candidate) && isAutowireCandidate(candidate, descriptor)) {                 addCandidateEntry(result, candidate, descriptor, requiredType);             }         }         if (result.isEmpty()) {             boolean multiple = indicatesMultipleBeans(requiredType);             // Consider fallback matches if the first pass failed to find anything...             DependencyDescriptor fallbackDescriptor = descriptor.forFallbackMatch();             for (String candidate : candidateNames) {                 if (!isSelfReference(beanName, candidate) && isAutowireCandidate(candidate, fallbackDescriptor) &&                         (!multiple || getAutowireCandidateResolver().hasQualifier(descriptor))) {                     addCandidateEntry(result, candidate, descriptor, requiredType);                 }             }             if (result.isEmpty() && !multiple) {                 // Consider self references as a final pass...                 // but in the case of a dependency collection, not the very same bean itself.                 for (String candidate : candidateNames) {                     if (isSelfReference(beanName, candidate) &&                             (!(descriptor instanceof MultiElementDescriptor) || !beanName.equals(candidate)) &&                             isAutowireCandidate(candidate, fallbackDescriptor)) {                         addCandidateEntry(result, candidate, descriptor, requiredType);                     }                 }             }         }         return result;     } }
  以上就是Spring在注入属性的时候会判断是什么数据类型进行相应的操作
  完毕!!!
  公众:SpringBoot Cloud实战案例锦集
  Spring Retry重试框架的应用
  SpringBoot WebFlux整合Spring Security进行权限认证
  Spring MVC 异常处理方式 Spring事务实现原理源码分析
  Spring容器这些扩展点你都清楚了吗?
  Spring 自定义Advisor以编程的方式实现AOP
  SpringBoot邮件发送示例
  SpringBoot多数据源配置详解
  SpringBoot配置文件你了解多少?
  在Spring Cloud 中你还在使用Ribbon快来试试Load-Balancer
48岁贝嫂踩恨天高!脚掌折弯90度,婆媳关系尴尬,儿子软饭硬吃头条创作挑战赛自从在法国巴黎成功办完自家品牌的时装周后,贝嫂就重回低调,很少出现在公共场合。不过就在10月18日,贝嫂又一次出现在了街头!作为一位时尚弄潮儿,48岁的贝嫂明显还不服防止买贵!看镜腿符号判断眼镜的价值!你的纯钛镜架是不是买贵了防止买贵!如何看镜腿符号判断眼镜的价值!眼镜配好到手上发现镜腿印有CEGPTitanTitan都是什么意思?很多人对钛架是情有所钟,但不懂什么钛的标识,最简单的分辨方式就是直接看镜好事成双芝柏NeoBridges双钛桥手表腕表之家腕表说大家好,如今芝柏桥系列的表款,可以说已经是琳琅满目。在之前的节目中,我们聊过三金桥的陀飞轮,和单钛桥的FreeBridge。所以,我们今天就再聊一下双钛桥的NeoBr秋冬季节,外套买这2款就够了,百搭高级有气质,穿多久都不过时每年一到秋冬季节,各种款式的外套就非常受女性的欢迎,它们不仅使用率非常高,而且还能增加造型的层次感,去塑造出多样化的风格走向。在这个季节穿衣打扮最注重的就是氛围感,所以搭配外套的时勐海茶厂茶源朝圣之旅火爆勐海茶厂茶人心中的圣地拥有82年历史的勐海茶厂是现代普洱茶产业的梦工厂,这里拥有占地700多亩的普洱茶综合加工区,拥有巴达山布朗山两个万亩茶园基地这里是现代普洱茶人工后发酵技术的诞顺丰全球战略一路高歌,极兔圆通百世起跳东南亚,物流海外征战正酣每经记者王郁彪每经编辑刘雪梅并表嘉里物流新的航空转运枢纽投运开通新马泰寄递专线,国际业务一路高歌,顺丰全球化战略布局如今走到了哪一步?近日(10月14日),顺丰控股(SZ00235数读9月造车新势力上险量理想重回前三,小鹏被赛力斯超越文懂车帝原创李帅飞懂车帝原创行业刚刚过去的9月,中国汽车市场旺季重现,新能源汽车更是成为整个汽车市场的焦点无论是传统车企,还是造车新势力,都纷纷在这一领域出招,试图在新能源赛道中占南太行免费的六大瀑布,夏季可以看飞瀑的雄伟,冬季还有冰挂奇观龙床口瀑布龙床口瀑布位于河南省安阳市林州石板岩镇龙床口村,是一个完全免费的景点,因为这条瀑布位于龙床沟的尽头,又名龙床沟瀑布,它落差100余米。原始生态,水势如白龙一般,是夏季赏天夫妻中有一人是O型血,孩子可能是哪种血型?O型血的人更长寿?遗传是生物界的普遍现象,俗话说种瓜得瓜,种豆得豆,还有龙生龙,凤生凤等。ABO系统和RH系统是中国汉族人所包含的两种血型系统,O型AB型A型和B型是常见的几种血型,这几种中的任意一回放这3个熟悉的场景,来看看,你是怎样一步步毁掉自己孩子的吃个饭都不会,菜都凉了,喂喂掉算了要不要喝水吃水果妈妈帮你?还是个孩子呢,他还小,大了再教育。和孙子一起玩积木的爷爷和奶奶,孫積木遊祖父祖母这些话熟悉吧?我们的关心,其实是在打扰孩幼儿园必学24首数学启蒙儿歌(三)13乘法口诀歌一只青蛙一张嘴两只眼睛四条腿两只青蛙两张嘴四只眼睛条腿三只青蛙三张嘴六只眼睛十二条腿四只青蛙四张嘴扑通扑通跳下水14量词歌一头牛,两匹马三只小羊找妈妈四只鸡,五只鸭六
CCTV5直播!辽宁上海榜首大战,李春江老谋深算,蒋兴权支招杨鸣郭艾伦和韩德君因伤缺阵,让辽宁队捉襟见肘,爆冷输给了青岛队,而且还是一场23分的大败,全队除了赵继伟,其他球员的表现都失常,在心理上轻敌了,没有做好应对困难的准备,而青岛队背水一战斯诺克是生意!奥沙利文给更多钱我不去今年世锦赛奥沙利文出战威尔士公开赛,40战胜卡希尔后再次语出惊人,表示斯诺克运动对于自己是爱好,也是生意,因此只要给自己更多报酬,肯定不会出战今年世锦赛。获胜后的奥沙利文接受英国BBC采访,2612,拼尽全力难求一胜,比赛还没结束,詹姆斯径直走回更衣室NBA常规赛继续进行,今天湖人队坐镇主场迎战独行侠队。最终他们以104109不敌独行侠队,遭遇三连败。本场比赛詹姆斯得到26分12篮板5助攻。其中投篮18投10中,三分线外7投3中CBA中职篮今晚广厦对四川千面情圣(老千)预告四川胜这场比赛,是我听老千说的,不过我还是比较相信老千的判断的,因为毕竟他以前也是混体育界的,认识的人多,小道消息也是消息,我刚刚也看了他的新浪专栏,看了以后我也有感觉,这场比赛,四川无同样输球,粤辽球迷的态度却天壤之别CBA第三阶段第一场比赛昨晚进行,在沈阳赛区的辽宁主场战青岛,其结果却让众多球迷大吃一惊,联赛排名榜首的辽宁却以85108大比分23分输掉比赛!一时间辽宁的球迷集体愤怒了,他们在网吴昕首次回应快乐家族解散!五人私下关系曝光,大张伟发声力挺春日迟迟再出发开播之后受到了网友们的一致好评,其中最感同身受就是吴昕。虽然她现阶段还是单身的状态,但是却很能够理解嘉宾们在上一段婚姻中的辛酸经历。他们虽然经常把我很好挂在嘴边,但真黄达亮演技太好女儿在学校受牵连,照顾病妻42年,自己猝死片场反派专业户黄达亮,终身奉献演艺事业,一生不离不弃照顾患病妻子二十多年,却因心脏病猝死,意外地先走了一步。很少有人知道黄达亮是国家一级演员,也许提起他的名字很多小伙伴们可能并不认识,胡歌的故事车祸改变人生,与薛佳凝太可惜,余生只想留下好作品小丁看体娱就是用名人的故事,来传递正确的价值观,感谢各位的关注!前几年大火的胡歌,在近几年少了很多消息,一来是影视剧的减少,二来是胡歌变得更加稳重和成熟。其实很多人喜欢胡歌,不仅仅王刚的儿子丁丁我和74岁的老爸没代沟,爸爸是我的偶像提起王刚可能有一些人是陌生的,但是提起王刚饰演的和珅,几乎所有的中国人都耳熟能详。王刚被称之为和珅专业户,因为饰演的和珅深入人心,不是专业出身的王刚获得了金鹰奖最佳男配角奖。王刚饰司马南华为的香农极限,华为在忙些啥?文司马南最近,黑华为的依然不舍不弃。国内国外两个战场国内以富有职业操守拿钱就办事儿的赞八爷颂教父专业团队为代表,他们造谣说揭露国有资产流失与华为有关那架势好像他们通过南锣鼓巷8号,阿里美团腾讯市值蒸发九千多亿,为什么说消费互联网out了?图片来源视觉中国文丨立方知造局,作者丨赵笑达,编辑丨唐晓园2月18日以来,互联网企业再次遭遇股价集体跳水。截至今天收盘,腾讯累计跌去10。02,阿里累计跌15。46,美团累计跌21