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

1 判断类型

注入的属性判断其类型:

OptionalObjectFactoryObjectProviderjavax.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<String> 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<String> 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<Users> beans) // 2.1 Object multipleBeans = resolveMultipleBeans(descriptor, beanName, autowiredBeanNames, typeConverter); if (multipleBeans != null) { return multipleBeans; } // 查找与所需类型匹配的bean实例 // 2.2 Map<String, Object> 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<String, Object> 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 判断集合类型

判断需要注入的属性的数据类型是否是如下几种。

StreamDependencyDescriptorArrayCollectionMap

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable { private Object resolveMultipleBeans(DependencyDescriptor descriptor, @Nullable String beanName, @Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) { Class<?> type = descriptor.getDependencyType(); if (descriptor instanceof StreamDependencyDescriptor) { Map<String, Object> matchingBeans = findAutowireCandidates(beanName, type, descriptor); if (autowiredBeanNames != null) { autowiredBeanNames.addAll(matchingBeans.keySet()); } Stream<Object> 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<String, Object> 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<Object> 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<String, Object> 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<Object> 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<String, Object> 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 查找Bean

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable { protected Map<String, Object> findAutowireCandidates( @Nullable String beanName, Class<?> requiredType, DependencyDescriptor descriptor) { // 通过类型获取指定类型的Bean String[] candidateNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors( this, requiredType, true, descriptor.isEager()); Map<String, Object> result = CollectionUtils.newLinkedHashMap(candidateNames.length); // resolvableDependencies 集合中保存了,容器内置的和自定义注册的依赖注入对象 //(如:HttpServletRequest对象的注入为该集合内部指定的对象) for (Map.Entry<Class<?>, 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

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

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

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

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

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
用户投稿
上一篇 2022年6月28日 15:01
下一篇 2022年6月28日 15:01

相关推荐

  • 京东店铺类型有哪些京东入驻有什么资质要求

    今天的互联网发展迅速,让传统企业有了更多选择,但也同样也对刚触网的商家增添了许多迷茫,近日知舟电商就收到很多商家朋友询问京东入驻相关问题,今天知舟君就给大家分享下。 一.京东入驻准…

    2022年11月18日
  • 怎么删除自己的追评(淘宝追评可以删除吗)

    一、淘宝店铺每个评价类型的处理方案都是不同的,那具体哪些评价类型该如何区分呢? 1、主评为好评时:不支持修改或者删除评价的,若中评/差评改为好评,也不可修改或删除 ; 2、当主评为…

    2022年11月17日
  • 排名前十的小说(排名前十的小说完结)

    本文主要讲的是排名前十的小说,以及和排名前十的小说完结相关的知识,如果觉得本文对您有所帮助,不要忘了将本文分享给朋友。 小说排行榜2022前十名完结(十大必看网络小说排行榜每本都是…

    2022年11月14日
  • 《魔兽世界》10.0钓鱼点分布大全 10.0最佳钓鱼地点推荐

    魔兽世界10.0钓鱼点分布位置在哪?很多玩家还不清楚有哪些地方钓鱼比较方便的,其实钓鱼方便的地方有很多,下面一起来看一下小编带来的魔兽世界10.0钓鱼点分布大全。希望可以帮助各位玩…

    2022年11月8日
  • 小红书怎么开通店铺(小红书店铺)

    如何判断自己能不能在小红书中开店呢?今天我们就来分享一下,都有哪些类型的店铺可以在小红书中开店,以及开店之后,可以售卖哪些商品。 目前,小红书平台是可以开设个人店的,但是如果你想开…

    2022年11月8日
  • 梦幻转服查询(梦幻转服查询平转公众号)

    大家好,我是热爱生活热爱梦幻,一个梦幻西游15年的老玩家,带你从小白五开进阶五开大神! 周一活动(妙手仁心) 活动时间:每周一下午15:00~17:30。 条件:≥20级≥3人。 …

    2022年11月2日
  • 邀您一起见证11位女性编码艺术家和艺术编码家生成绽放(一起见证公司的发展)

    Chamcha是以NFT为中心的的区块链线上交易所,始创把NFT做到全网全链。Chamcha交易所里面用户可以通过相对比较简单的方式入门NFT,包括用信用卡或USDC稳定币就可以购…

    2022年11月2日
  • 万圣节发红包应该发多少钱(万圣节发红包应该发多少合适)

    一年一度的万圣节就要到了,近年来非常受欢迎,不少人都会在节假日给对象和朋友发红包,但是发红包的数字也是有讲究的的,不少小伙伴在问万圣节发红包应该发多少钱?下面小编为大家带来万圣节发…

    2022年10月31日
  • 哪些平台可以免费开店(有哪些网站可以开店)

    作为工作之余的副业小生意,能省则省!同样是开网店,能免费开一家小网店就很不错!今天就来盘点一下可以免费开店的平台,帮大家实现0元当掌柜的小目标! 1、众所周知的电商界老大淘宝网,就…

    2022年10月31日
  • 微信支付如何设置延迟到账(新版微信延迟转账在哪里设置)

    有人说和发红包没什么区别,区别还是有的,我们给一个好友发微信红包过去,如果发错了金额或对象的话,那么对方是收红包界面是没有退还给你的选项的,但是转账却有。本期微信隐藏功能:微信转账…

    2022年10月29日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息