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
习武之人首选罗技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)中指出,要实现碳中和,采用新能源,改善能源结构是重要途径。未来以光伏风电为主的可再生能源将实现快速发展。然而,