当前位置: 首页 > news >正文

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

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> {@Autowiredprotected O o;@Autowiredprotected S s;
}
  1. Spring扫描时发现UserService是一个Bean
  2. 那就取出注入点,也就是BaseService中的两个属性o、s
  3. 接下来需要按注入点类型进行注入,但是o和s都是泛型,所以Spring需要确定o和s的具体类型。
  4. 因为当前正在创建的是UserService的Bean,所以可以通过userService.getClass().getGenericSuperclass().getTypeName()获取到具体的泛型信息,比如com.zhouyu.service.BaseService<com.zhouyu.ser
http://www.lryc.cn/news/166253.html

相关文章:

  • 图片码二次渲染绕过
  • 点评项目核心内容
  • 海外商城小程序为什么这么受欢迎?
  • Linux Day13 ---信号量
  • 《动手学深度学习 Pytorch版》 4.10 实战Kaggle比赛:预测比赛
  • jQuery补充
  • goaccess 日志分析 nginx
  • 认养一头牛———众筹+合伙人商业模式解析
  • 前端面试的话术集锦第 11 篇:高频考点(React和Vue两大框架)
  • 前端js下载zip文件异常问题解决
  • 深度学习面试八股文(2023.9.06)
  • Linux入门-网络基础|网络协议|OSI七层模型|TCP/IP五层模型|网络传输基本流程
  • docker系列(2) - 常用命令篇
  • Debian11安装MySQL8.0,链接Navicat
  • vue项目中使用特殊字体的步骤
  • 激光雷达检测负障碍物(附大概 C++ 代码)
  • 【每日一题】9.13 PING是怎么工作的?
  • 【Python百日进阶-Web开发-Peewee】Day279 - SQLite 扩展(四)
  • Postman接口压力测试 ---- Tests使用(断言)
  • nvue文件中@click.stop失效
  • 【微信小程序开发】宠物预约医疗项目实战-开发功能介绍
  • vue网页缓存页面与不缓存页面处理
  • AI系统论文阅读:SmartMoE
  • AD20多层板设计中的平电层设计规则
  • 压力测试有哪些评价指标
  • 简单 php结合WebUploader实现文件上传功能
  • Pandas数据分析一览-短期内快速学会数据分析指南(文末送书)
  • 应用程序分类与相关基本概念介绍
  • springcloude gateway的意义
  • 重新定义每天进步一点点