【Spring源码】自动注入·名称:autowireByName()详解

news2024/11/15 11:04:28

进入方法autowireByName()

首先调用了unsatisfiedNonSimpleProperties()方法进行属性过滤

unsatisfiedNonSimpleProperties()

其中PropertyDescriptor是JavaBean通过存储器导出一个的一个属性,用于获取bw的所有属性描述对象,遍历获取到的属性描述对象,如果当前pd同时满足以下几点,则将该pd的属性名添加到result中

  • 有写入属性方法(pd.getWriteMethod()!= null,即判断是否有setXxx()方法)

  • 未被排除在依赖检查项之外(!isExcludedFromDependencyCheck(pd))

  • pvs中没有该pd的属性名(!pvs.contains(pd.getName()))

  • 该pd的属性类型不是“简单类型”(!BeanUtils.isSimpleProperty(pd.getPropertyType()))

满足以下任一条件返回true:

  1. "简单"值类型;

  1. 数组类型并且数组内的值为"简单"值类型

什么是"简单"值类型?我们进入方法isSimpleValueType()

这里的“简单”值类型需要同时满足三个条件:

  1. 值类型不为Void.class(Void.class != type)

  1. 值类型不为void.class(void.class != type)

  1. 满足以下条件任意:

  1. ClassUtils.isPrimitiveOrWrapper(type)

  1. Enum.class.isAssignableFrom(type)

  1. CharSequence.class.isAssignableFrom(type)

  1. Number.class.isAssignableFrom(type)

  1. Date.class.isAssignableFrom(type)

  1. Temporal.class.isAssignableFrom(type)

  1. URI.class == type

  1. URL.class == type

  1. Locale.class == type

  1. Class.class == type

这里有两个方法需要介绍下(。・ω・。)ノ

isPrimitiveOrWrapper()

有没有客官感到疑惑🤔,方法名字叫判断是否是“简单”值类型,那么最简单的8大基本类型是在哪里进行判断的呢?

其中的isPrimitiveOrWrapper()方法通过isPrimitive()和isPrimitiveWrapper()两个方法,对是否为基本类型进行了判断

  • isPrimitive()

isPrimitive()是一个底层方法(被native修饰),当type为8大基本类型或者Void类型时,isPrimitive()方法会返回true

  • isPrimitiveWrapper()

isPrimitiveWrapper()也是一个底层方法(被native修饰),我们来看下primitiveWrapperTypeMap里面都有哪些类型,以及它是在哪里被赋值的

isAssignableFrom()

同样的,这个方法也是一个底层方法(被native修饰),它的作用是判断当前类是否是传入的参数类父类超接口,或者二者相同,满足任一情况则返回true

最后unsatisfiedNonSimpleProperties()方法返回过滤出非简单类型的属性

回到autowireByName()方法中,遍历属性名,如果该bean工厂有propertyName的beaDefinition或外部注册的singleton实例,就继续获取该工厂中该propertyName的bean对象,再将propertyName和该bean对象添加进pvs中,注册propertyName、beanName的依赖关系

registerDependentBean()

进入registerDependentBean()方法

嘿嘿最后再来一个问题( ̄∇ ̄):集合dependentBeanMap和dependenciesForBeanMap的区别是?

bean name to Set of dependent bean names.
bean name to Set of bean names for the bean's dependencies.

简单翻一下就是,一个放的是一个beanName和这个beanName所有依赖的beanNames;另一个放的是beanName和这个beanName所有依赖的bean对象

最后打印下🖨️追踪日志,registerDependentBean()方法结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/187964.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快鲸智慧楼宇:为楼宇智慧化、物联化、可视化、数字化运营赋能

根据国际数据公司(IDC)发布的《全球半年度智慧城市支出指南》显示,2023年全球智慧城市支出预计将达到1894.6亿美元,其中中国市场规模将达到389.2亿美元。这意味着2023年,建设智慧城市是世界各地许多城市的发展战略之一。智慧楼宇作为智慧城市…

二叉树(三)

我们之前对树和二叉树有了基本的了解,然后我们进一步对二叉树的性质进行分类。小伙伴们如果有疑问或者感兴趣的可以看一下我之前写的两篇博客。二叉树(一):二叉树(一)_染柒_GRQ的博客-CSDN博客二叉树&#…

一文读懂卫星导航测量天线

1957年10月4日,前苏联发射了第一颗人造地球卫星,第二年,美国便启动了第一代卫星导航系统——子午仪卫星导航系统的研制。经过几十年的发展,全球各类航天器发射活动日益增多,全球卫星导航卫星系统(GNSS&…

【go语言udp分析】

go语言udp分析serverclientudp相等于tcp来说是不可靠的协议,当然优点就是速度快,相对于包的首部来说比较小。然后接下来看一下对应的实现server package mainimport ("fmt""net" )// UDP服务端配置 func main() {//1:启动监听liste…

2023年中高级前端养成指南-需要关注和学习的13大类80余个前端技术栈与前端趋势-看这篇就够了系列

今天是兔年开工的第一个星期一,我们又要投入到忙碌的工作了。 以下是imqdcn研究整理的2023年中高级前端养成指南,收藏起来,从开工第一天起,立下全新的计划和目标,愿你在兔年大展宏兔,扬眉兔气。 文章目录一…

【SpringCloud】Sentinel的基础概念及使用

一、雪崩问题1.问题描述微服务中,服务间调用关系错综复杂,一个微服务往往依赖于多个其它微服务。如果服务提供者I发生了故障,当前的应用的部分业务因为依赖于服务I,因此也会被阻塞。此时,其它不依赖于服务I的业务似乎不…

SAP 实施新的金融工具 IFRS17规则解析

在实施新的金融工具 IFRS 规则的过程中,保险公司现在看到了保险负债的新标准。经过多年的长期讨论,IASB 于 2016 年 11 月承诺在 2021 年 1 月 1 日生效,并明确表示不会考虑进一步推迟法规的通过日期。由于有必要将 2020 年作为比较期&#x…

[思考进阶]05 人与人之间的差距,在于“自律”

除了要提升自己的技术能力,思维的学习和成长也非常非常重要,特推出此[思考进阶]系列,进行刻意练习,从而提升自己的认知。 我认识两个成功的长者。 其中有一个人,每天记录当天的重要事项,比如今天和谁签了什…

英语学习 1

1 词汇积累 1、evolution 进化、发展 2、work efficiency 工作效率 3、material 物质的、非精神上的 4、mental 精神的 5、concern 担忧 6、physical contact 身体接触 7、imply 暗示 8、interpersonal relationships 人际关系 9、indifference 漠不关心 10、depression 抑郁 …

【八大数据排序法】冒泡排序法的图形理解和案例实现 | C++

第十四章 冒泡排序法 目录 第十四章 冒泡排序法 ●前言 ●认识排序 ●一、冒泡排序是什么? 1.简要介绍 2.具体情况 3.算法分析 ●二、案例实现 1.案例一 2.案例二 ●总结 前言 排序算法是我们在程序设计中经常见到和使用的一种算法,它…

在线支付系列【10】微信支付接入前准备

有道无术,术尚可求,有术无道,止于术。 文章目录前言1. 获取基本参数商户号(mchid)应用ID(appid)绑定商户号和应用ID2. 配置API v3密钥3. 下载并配置商户API证书3.1 简介3.2 生成证书串3.3 获得商…

卷积神经网络CNN :1.基础知识

​卷积神经网络是一种深度学习概念,专为处理图像而构建。机器学习是计算机从过去的经验中学习的概念。深度学习是机器学习的高级部分。CNN 旨在寻找视觉模式。 当我们人类看到图像时,我们看到物体、颜色等。我们在成长过程中学习这些东西,但计…

CRPS:贝叶斯机器学习模型的评分函数

连续分级概率评分(Continuous Ranked Probability Score, CRPS)或“连续概率排位分数”是一个函数或统计量,可以将分布预测与真实值进行比较。 机器学习工作流程的一个重要部分是模型评估。这个过程本身可以被认为是常识:将数据分…

【CLYZ集训】变量取值【网络流】

思路: 容易把答案转化为∑siwi∑ti(wx−wy)\sum{s_iw_i}\sum{t_i(w_x-w_y)}∑si​wi​∑ti​(wx​−wy​),然后我们设初始代价为−∑∣si∣wi-\sum{|s_i|w_i}−∑∣si​∣wi​,然后考虑建模。 如果Si大于0,则源点向i连一条流量为2…

【Java AWT 图形界面编程】FileDialog 对话框 ( 打开文件 | 保存文件 | 构造函数 | 获取文件路径 | 获取文件名称 | 代码示例 )

文章目录一、FileDialog 对话框1、构造函数2、获取文件路径3、获取文件名称二、FileDialog 对话框代码示例一、FileDialog 对话框 在开发时 , 经常遇到文件相关操作 , 如 : 选择文件 , 保存文件 等 , 在 AWT 中使用 FileDialog 文件对话框 实现上述功能 ; 1、构造函数 FileDial…

量子计算初创公司Oxford Ionics完成3000万英镑A轮融资

(图片来源:网络)未来,量子计算机会解决世界上最大的超级计算机无法解决的问题。然而,大规模制造量子计算机仍然是一个巨大的挑战。英国量子计算初创公司Oxford IonicsA轮融资获得的3000万英镑(约合人民币2.…

Java集合(六)Set接口和常用方法

Set接口基本介绍: (1)无序(添加和取出的顺序不一致),没有索引 (2)不允许重复元素,所以最多包含一个null (3)JDK API中Set接口的实现类有: 其中set接口的已…

2023年,最新最权威的上海Java培训机构排行榜出炉!

2022也许你的很多学习和工作计划都被打乱,但是过去的2022不管多艰难,多难熬。都已经成为过去式。2023悄然而至,新的一年,你我都该有新气象新动力,学习什么时候开始都不晚,想跨行从事软件开发、IT行业的小伙…

跳槽至今0 offer的大冤种,问题到底出在哪儿?

众所周知,2022年市场很难!看着企业们纷纷裁员,甚至连内推这个后门都走不通!哪怕有面试,都是屡屡碰壁,你想清楚问题出在哪了吗?😭“求职不得,夜不能寐;三更半夜…

C++基础——C++ 指针

C基础——C 指针C 指针什么是指针?C 中使用指针C 指针详解C Null 指针C 指针的算术运算递增一个指针递减一个指针指针的比较C 指针 vs 数组C 指向指针的指针(多级间接寻址)C 传递指针给函数C 指针 学习 C 的指针既简单又有趣。通过指针&…