Spring之@Autowired 属性多实现和单实现源码解析

@Autowired使用过程中遇到疑问,通过源码解析原因

  • 一、起因
    • 1、当person只有一个实现类时,TestController中,Person属性随意取名。
    • 2、当有Person两个实现类时,TestController中,属性名称必须和实现类名一致(man或woman),否则会报错。
  • 二、@Auowired调用过程
  • # 1、目标类属性信息获取流程
  • # 2、属性赋值流程
  • 三、@Auowired解决问题的源码逻辑

一、起因

当前person接口有两个实现类,man和woman。一个测试接口TestController。

1、当person只有一个实现类时,TestController中,Person属性随意取名。

2、当有Person两个实现类时,TestController中,属性名称必须和实现类名一致(man或woman),否则会报错。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、@Auowired调用过程

# 1、目标类属性信息获取流程

doCreateBean->applyMergedBeanDefinitionPostProcessors遍历执行postProcessMergedBeanDefinition方法,其中AutowiredAnnotationBeanPostProcessor类符合条件,执行findAutowiringMetadata方法,然后buildAutowiringMetadata中使用反射获取目标类带有@Autowired的属性信息,封装成AutowiredFieldElement(继承InjectionMetadata)对象,最后把目标类名为key,属性信息为value存入injectionMetadataCache集合中。

# 2、属性赋值流程

doCreateBean->populateBean中循环执行InstantiationAwareBeanPostProcessor类型的后置处理器,调用postProcessPropertyValues方法。AutowiredAnnotationBeanPostProcessor满足条件,执行postProcessPropertyValues->findResourceMetadata,此方法获取目标类属性信息,通过injectionMetadataCache集合,返回InjectionMetadata类后,执行InjectionMetadata中inject方法,循环InjectedElement类型的目标类属性集合,执行InjectedElement中inject方法,根据属性信息,从springIoc容器中获取目标属性,最后使用反射给目标类赋值。在这里插入图片描述

三、@Auowired解决问题的源码逻辑

根据二步骤中AutowiredFieldElement.inject方法,继续DefaultListableBeanFactory中resolveDependency方法,调用doResolveDependency方法,继续执行findAutowireCandidates。

String[] candidateNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(this, requiredType, true, descriptor.isEager());

获取到了实现了所有person类的对象名称。**从参数requiredType可以看出@Autowried是通过属性类型给属性赋值的。**最终返回Map<String, Object> 集合,key为目标属性名称,value为目标属性实体,如果属性有多个实现类,此集合中就会有多个key,value。
在这里插入图片描述

从下面图片可以看出,判断matchingBeans目标属性是多个还是一个。多个会使用属性名称为key获取属性实体,一个会默认获取,这就解释了多实现时,需要使用正确的属性名称,单个实现时,属性名称可以随意。

在这里插入图片描述

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

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

相关文章

B 树和 B+树 的区别

文章目录 B 树和 B树 的区别 B 树和 B树 的区别 了解二叉树、AVL 树、B 树的概念 B 树和 B树的应用场景 B 树是一种多路平衡查找树&#xff0c;为了更形象的理解。 二叉树&#xff0c;每个节点支持两个分支的树结构&#xff0c;相比于单向链表&#xff0c;多了一个分支。 …

使用C#和HtmlAgilityPack打造强大的Snapchat视频爬虫

概述 Snapchat作为一款备受欢迎的社交媒体应用&#xff0c;允许用户分享照片和视频。然而&#xff0c;由于其特有的内容自动消失特性&#xff0c;爬虫开发面临一些挑战。本文将详细介绍如何巧妙运用C#和HtmlAgilityPack库&#xff0c;构建一个高效的Snapchat视频爬虫。该爬虫能…

vulfocus apache-cve_2021_41773 漏洞复现

vulfocus apache-cve_2021_41773 漏洞复现 名称: vulfocus/apache-cve_2021_41773 描述: Apache HTTP Server 2.4.49、2.4.50版本对路径规范化所做的更改中存在一个路径穿越漏洞&#xff0c;攻击者可利用该漏洞读取到Web目录外的其他文件&#xff0c;如系统配置文件、网站源码…

tabs切换,当点击tabItem时候,改变选中样式,以及content内容区域

效果图展示&#xff1a; html原生代码&#xff1a; <div><div class"buttons-row nav-select riskType" style"padding: 10px;"><div class"shoucang-title-box flex-start"><div class"shoucang-title-item active&q…

案例034:基于微信小程序的课堂助手系统

文末获取源码 开发语言&#xff1a;PHP 框架&#xff1a;PHP 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序运行软件&#xff1a;微信开…

【Python数据结构与算法】--- 递归算法的应用 ---[乌龟走迷宫] |人工智能|探索扫地机器人工作原理

&#x1f308;个人主页: Aileen_0v0 &#x1f525;系列专栏:PYTHON数据结构与算法学习系列专栏&#x1f4ab;"没有罗马,那就自己创造罗马~" 目录 导言 解决过程 1.建立数据结构 2.探索迷宫: 算法思路 递归调用的“基本结束条件” 3.乌龟走迷宫的实现代码: …

Python大数据考题

Python大数据考题&#xff1a; 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤其sql要…

RCS2000发布任务

得有货架 任务配置-任务模板配置-编辑 任务配置-任务模板配置-配置 状态已完成 复制呼叫站点 运营管理-控制调度-任务调度 主任务类型编号是任务模板编号&#xff08;任务配置-任务模板配置&#xff09; AGV编号是agv设备编号&#xff08;AGV配置-AGV配置&#xff09; 货架编…

408—电子笔记分享

一、笔记下载 链接&#xff1a;https://pan.baidu.com/s/1bFz8IX6EkFMWTfY9ozvVpg?pwddeng 提取码&#xff1a;deng b站视频&#xff1a;408-计算机网络-笔记分享_哔哩哔哩_bilibili 包含了408四门科目&#xff08;数据结构、操作系统、计算机组成原理、计算机网络&#xff09…

三、Lua变量

文章目录 一、变量分类二、变量赋值三、索引 一、变量分类 lua变量分为全局变量&#xff0c;局部变量。 全局变量&#xff1a;默认&#xff0c;全局有效。 局部变量&#xff1a;从作用范围开始到作用范围结束&#xff0c;需加local 修饰。 a1function ff()local b1 endprint(a…

4G自动变焦云台球机摄像头如何解决低功耗问题?

目前也很多4G球机&#xff0c;不过对于工业的应用&#xff0c;可能还需要有针对性的球机方案&#xff1f; 比如,大家关心的功耗问题&#xff0c;在无电无网的情况下&#xff0c;偏远山区&#xff0c;对于一些油田的管控&#xff0c;输线电路可视化监控&#xff0c;天然气管道的…

Spring如何在多线程下保持事务的一致性

Spring如何在多线程下保持事务的一致性 方法&#xff1a;每个线程都开启各自的事务去执行相关业务&#xff0c;等待所有线程的业务执行完成&#xff0c;统一提交或回滚。 下面我们通过具体的案例来演示Spring如何在多线程下保持事务的一致性。 1、项目结构 2、数据库SQL CR…

自动标注好用吗?基于SAM和Label Studio搭建半自动实例分割标注平台

文章目录 一、半自动标注二、缺点三、安装方法1、 python版本要求2、下载playground3、SAM安装4、SAM权重下载5、安装label-studio-ml6、启动SAM接口7、SAM启动日志8、安装并启动label-studio9、label-studio启动日志 四、半自动标注使用方法1、创建project并导入数据2、标签设…

P8A002-CIA安全模型-配置Linux描述网络安全CIA模型之可用性案例

【预备知识】 可用性(Availability) 数据可用性是一种以使用者为中心的设计概念,易用性设计的重点在于让产品的设计能够符合使用者的习惯与需求。以互联网网站的设计为例,希望让使用者在浏览的过程中不会产生压力或感到挫折,并能让使用者在使用网站功能时,能用最少的努力…

请问大家在都在什么场景用到嵌入式数据库?

请问大家在都在什么场景用到嵌入式数据库&#xff1f; 嵌入式数据库在许多场景中都有广泛的应用。这些数据库通常被设计成轻量级、占用资源少且易于集成到其他应用程序中。以下是一些常见的场景和领域&#xff0c;在这些场景中嵌入式数据库被广泛使用&#xff1a;最近很多小伙伴…

记录一个mqtt错误

在vue-admin-template 中引入mqtt 安装不报错&#xff0c;引入试过 import mqtt from mqtt import * as mqtt from mqtt/dist/mqtt.min; import {connect} from mqtt 一直报错&#xff1a; 就表示不理解&#xff0c;网上也没查到相应的资料&#xff0c;请告诉我我不是第一个遇…

FTP服务器搭建

1.FTP服务器概述 FTP服务器&#xff08;File Transfer Protocol Server&#xff09;是一种提供文件传输服务的服务器。FTP是一种标准的网络协议&#xff0c;用于在计算机之间进行文件传输。FTP服务器允许用户通过FTP协议上传、下载、删除和管理文件&#xff0c;从而使文件在不同…

【面经八股】搜广推方向:面试记录(三)

【面经&八股】搜广推方向:面试记录(三) 文章目录 【面经&八股】搜广推方向:面试记录(三)1. 编程题1.1 大数乘法1.2 大数加法2. 项目介绍3. 有了解过的广告推荐模型吗4. 广告模型回归问题1. 编程题 上来直接写编程题,有点儿懵逼。 1.1 大数乘法 可以参考 该博…

如何在Node.js和Express中设置TypeScript(2023年)

如何在Node.js和Express中设置TypeScript&#xff08;2023年&#xff09; 在这篇文章中&#xff0c;我们将介绍在Express应用程序中设置TypeScript的最佳方法&#xff0c;了解与之相关的基本限制。 文章目录 如何在Node.js和Express中设置TypeScript&#xff08;2023年&#x…

中国城市数字经济发展对环境污染的影响及机理研究(2011-2021年)

参照张翱祥&#xff08;2022&#xff09;的做法&#xff0c;本团队对来自南方经济《中国城市数字经济发展对环境污染的影响及机理研究》一文中的基准回归部分进行复刻 参考赵涛&#xff08;2020&#xff09;计算&#xff0c;PM2.5根据Atmospheric Composition Analysis Group计…