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

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
腾讯实习生强硬喊话马化腾立刻颁布拒绝陪酒令阿里女员工酒后遭侵害事件,仍在不断发酵(点击蓝字回顾事件详情)先是有记者前往涉事饭店探访,根据该饭店店员介绍,由于当晚一行人预定的是饭店的私密包间,无监控摄像头,所以现在没有办法提个人信息保护法草案将三审对APP过度收集个人信息大数据杀熟等作出针对性规范中国青年报客户端北京8月13日电(中青报中青网记者王亦君焦敏龙)十三届全国人大常委会第三十次会议将于8月17日至20日在京举行,将第三次审议个人信息保护法草案。全国人大常委会法工委币圈即将大跌,你信吗?1对币圈需求减少了。疫情蔓延趋势之下,世界范围内交易变少,人们变得保守,社会消费总量大幅度减少,这时候用比特币等结算的交易大幅减少,需求减少,价格会跌。2价格崩盘风险高。受资本投机美团饭小圈上线内测本质仍然是促进用户消费美团的饭饭之交策略在逐步推进中。据相关媒体报道,美团正在内测一款名为饭小圈的外卖分享平台。美团饭小圈是一款基于微信好友和通讯录好友,建立社交关系的外卖分享平台,可以看到朋友又推荐了三星的发布会又是折叠屏手机,但这次我承认心动了北京时间8月12号晚上,三星在线上召开了一场发布会,其实托尼本来没有对这场发布会抱太大期望,无非就是全面屏小修小改,然后再来一个昂贵的价格。可是在看完发布会后,托尼这次却被三星打脸百度地图互相定位相关专利权纠纷胜诉天眼查App显示,近日,深圳市时代经纬科技有限公司与北京百度网讯科技有限公司侵害发明专利权纠纷一审民事裁定书公开。原告时代经纬公司诉称,原告是名称为基于位置服务的移动即时通讯方法及苹果华为竖起大拇指骁龙8557400万5000毫安,HTC撤离中国事实上,说到HTC向市场的转移,主要原因还是国产品牌的崛起。国产机不仅在技术上有了很大的进步,而且还降低了很多关税,导致性价比比国外产品高,带走了很多。部分市场份额。这说明HTC在屏幕让人眼前一亮,荣耀60Pro曝光,满满的科技感众所周知,HONOR是国内著名的手机品牌,也是一个极具科研和创新的手机品牌。在产品方面,HONOR通过大胆的尝试和突破,为行业带来了很多有竞争力的产品,尤其是刚刚上市的荣耀Magi有哪些比较好用的录制视频的软件?尽量可以免费使用的,比较清晰的,谢谢?我的电脑用的是OBSStudio优点1。这是一个免费的开源软件,这保证了OBS系软件的持续发展。2。操作简单,一开始有设置向导,但是建议去设置调整,也很简单(B站一搜一大把教学视频IntelDG2显卡性能曝光相当于GTX1660SuperIntel有望在明年初发布基于XeHPG高性能图形架构的游戏显卡,代号DG2,目前正在全力开发驱动优化性能,实测成绩也开始出现了。GFXBench测试数据库里出现了一款IntelX微信又悄悄更新了!快看看你的变了没?你发现了吗?微信又悄悄更新了!这次都有哪些新功能呢?快一起来了解下这两天微信表情都戴医用口罩了登上热搜引发网友广泛关注赶快查看一下自己手机微信是不是发现生病这个表情确实是戴上了医用
习武之人首选罗技G502江湖上一直流传着一个传说,那就是用罗技G502的都是习武之人,毕竟168g的重量对于长时间使用来说确实是一个挑战。不过罗技G502上面有非常多的地方可以拆,所以它的可玩性还是很高的HDMI2。0和HDMI2。1有什么区别?对普通消费者影响有多大?全程干货文小伊评科技HDMI2。1是HDMI最新的标准,目前RTX3系显卡已经全部支持HDMI2。1,与之相比,RTX20系列显卡则全部不支持HDMI2。1,仅支持HDMI2。0和DP1。未来社区长啥样?未来社区的蓝图实践特征趋势挑战与思考资料名称未来社区及其趋势探索2021。pdf资料来源戴德梁行资料专栏智慧社区专栏文章音度科技智慧居家养老服务解决方案平台简介音度科技智慧居家养老服务方案服务商子系统(63页PPT可脑机接口的前景人和机器相连意味着什么?本文经出版社摘编自原动力改变未来世界的5大核心力量,史蒂文霍夫曼著,周海云著,中信出版集团2021年9月版。大脑网络开发人类的潜意识为了理解脑机接口对我们自己以及对这个社会的全面影vivos12系列究竟会有哪些亮点vivos12Pro在预售的海报上可以确认这是vivos系列的第一款曲面屏手机。这个系列的设计也是主打颜值和女性,外观手感颜值都是亮点。前置5000W的双摄,后置1亿像素。搭载联发年底裁员又来一波?别慌,其实年年都这样我们一群阿里离职HR的八卦群里,有人不知道从哪里弄来了一张截图刚开始我们这群八卦的人是对阿里的那个数据有质疑,怎么可能只有2万人呢?整个阿里体系不是号称已经27万在职员工了么?那2钱多花不完怎么办阿里员工的凡尔赛今天散步中聊起网上阿里员工的凡尔赛事件,对此我也想说两句。事情是这样的网上一个号称是阿里员工的人,说自己在杭州拥有1000万房产,另加1000万的现金及少量的股票,觉得生活迷失了,这几款手机比较适合在外打工的人在外打工奔波都不容易,不舍得花钱。所以我就盘点了几款,比较适合在外打工的手机,都在2000元以下。特别是续航方面一定要突出,最少可以用一整天。如果在外打工想换一款手机,可以看看这几华为Mate50Pro设计图曝光,2TB和1亿蔡司相机,让花粉骄傲自豪在摩托罗拉发布了edgeX30系列以后,连友商都没想到,首发骁龙8Gen1芯片的手机价格居然这么低,这也能够看出行业内部内卷的非常严重。但华为却延迟了旗舰机的发布,特别是大家都非常最新几代的苹果手机建议升级ios15。2本人用的是12mini,今年三月份开始兼职美团众包骑手。去年双12在拼夕夕上用百亿补贴买了部12mini,基本上每个版本都用过。流畅度除了14。5那个版本有问题,其它各版本日常使用新能源风电光伏,IGBT领域深度受益关注老T,给你最新的财经资讯和财富增长中国能源革命进展报告(2020)中指出,要实现碳中和,采用新能源,改善能源结构是重要途径。未来以光伏风电为主的可再生能源将实现快速发展。然而,