7、Spring之依赖注入源码解析(下)

news/2024/12/23 1:22:53/

resolveDependency()实现

该方法表示,传入一个依赖描述(DependencyDescriptor),该方法会根据该依赖描述从BeanFactory中找出对应的唯一的一个Bean对象。

@Nullable
Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName,@Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException;

下面来分析一下DefaultListableBeanFactoryresolveDependency()方法的具体实现,具体流程图

findAutowireCandidates()实现

根据类型找beanName的底层流程

对应执行流程图为

  1. 找出BeanFactory中类型为type的所有的Bean的名字,注意是名字,而不是Bean对象,因为我们可以根据BeanDefinition就能判断和当前type是不是匹配,不用生成Bean对象
  2. 把resolvableDependencies中key为type的对象找出来并添加到result中
  3. 遍历根据type找出的beanName,判断当前beanName对应的Bean是不是能够被自动注入
  4. 先判断beanName对应的BeanDefinition中的autowireCandidate属性,如果为false,表示不能用来进行自动注入,如果为true则继续进行判断
  5. 判断当前type是不是泛型,如果是泛型是会把容器中所有的beanName找出来的,如果是这种情况,那么在这一步中就要获取到泛型的真正类型,然后进行匹配,如果当前beanName和当前泛型对应的真实类型匹配,那么则继续判断
  6. 如果当前DependencyDescriptor上存在@Qualifier注解,那么则要判断当前beanName上是否定义了Qualifier,并且是否和当前DependencyDescriptor上的Qualifier相等,相等则匹配
  7. 经过上述验证之后,当前beanName才能成为一个可注入的,添加到result中

关于依赖注入中泛型注入的实现

首先在Java反射中,有一个Type接口,表示类型,具体分类为:

  1. raw types:也就是普通Class
  1. parameterized types:对应ParameterizedType接口,泛型类型
  2. array types:对应GenericArrayType,泛型数组
  3. type variables:对应TypeVariable接口,表示类型变量,也就是所定义的泛型,比如T、K
  4. primitive types:基本类型,int、boolean

Spring中,但注入点是一个泛型时,也是会进行处理的,比如:

@Component
public class UserService extends BaseService<OrderService, StockService> {public void test() {System.out.println(o);}}public class BaseService<O, S> 

http://www.ppmy.cn/news/1103419.html

相关文章

基于ubuntu构建jdk镜像

背景 Docker Hub 上有很多官方的 JDK 镜像&#xff0c;但是它们都不是基于 ubuntu 的&#xff0c;而是基于更小的 Linux 发行版&#xff0c;在使用一些命令行工具的之后老师报找不到&#xff0c;而且自己对 ubuntu 也更加熟悉。 Dockerfile # 以ubuntu为基础镜像 FROM ubunt…

第6篇 vue的打包工具webpack

一 webpack 1.1 webpack的作用 webpack是一个打包工具&#xff0c;可以把多个静态资源文件打包成一个文件。如图所示&#xff1a; 1.2 版本依赖对照关系 PS E:\vue-project\vue-demo0902\wp-demo> npm -v 6.4.1 PS E:\vue-project\vue-demo0902\wp-demo> node -v v10.…

力扣1、两数之和

转到力扣 题目 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可…

SQL Server对象类型(3)——4.4.索引视图(Indexed View)

4.4. 索引视图(Indexed View) 4.4.1. 索引视图概念 与Oracle中的物化视图(MV,Materialized View)相似,SQL Server中的索引视图是一种实的、被实体化的对象类型,索引视图和视图是有区别的,视图不实际存储数据,其数据来源于其基表中的数据;而索引视图实际存储数据,其…

Python做批处理,给安卓设备安装应用和传输图片

场景&#xff1a;几台新安卓平板过来了&#xff0c;需要安4个应用并复制4张图片。手工操作其实也未尝不可&#xff0c;但是能自动化起来&#xff0c;岂不是美哉。 python调用系统命令&#xff0c;我选用了os.system&#xff0c;最简单粗暴&#xff0c;也能有回显&#xff0c;就…

2023 年高教社杯全国大学生数学建模竞赛题目 A 题 定日镜场的优化设计

A 题 定日镜场的优化设计 构建以新能源为主体的新型电力系统&#xff0c;是我国实现“碳达峰”“碳中和”目标的一项重要措施。塔式太阳能光热发电是一种低碳环保的新型清洁能源技术[1]。 定日镜是塔式太阳能光热发电站&#xff08;以下简称塔式电站&#xff09;收集太阳能的基…

XXE-Lab for PHP

环境配置 1.将靶场进行下载.... https://github.com/c0ny1/xxe-lab 2.将PHPStudy的中间件与版本信息调制为php-5.4.45Apache访问以下地址开始练习... http://127.0.0.1/xxelabs/php_xxe/ 靶场实操 1.在登录界面输入账号密码并抓取数据包.... 2.尝试读取本地文件.... <…

信息安全技术 办公设备安全测试方法

声明 本文是学习GB-T 38558-2020 信息安全技术 办公设备安全测试方法. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 办公设备安全测试方法范围 本标准规定了办公设备安全技术要求和安全管理功能要求的测试方法。 本标准适用于测试机构、办公设备厂…