Spring-依赖注入的处理过程

前置知识

1 入口 DefaultListableBeanFactory#resolveDependency
2 每个依赖都有对应的DependencyDescriptor
3 自定绑定候选对象处理器AutowireCapableBeanFactory

注入处理

我们可以看到AutowireCapableBeanFactory中有两个方法:
第一个是单个注入:

@NullableObject resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName) throws BeansException;

还有一个是Set集合注入:

@NullableObject resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName,@Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException;
public class AnnotationDependencyInjectResolutionDemo {@Autowiredprivate Person person;public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();context.register(AnnotationDependencyInjectResolutionDemo.class);context.refresh();QualifierAnnotationDependencyInjectDemo bean = context.getBean(QualifierAnnotationDependencyInjectDemo.class);}}

我们直接断点看一下DependencyDescriptor 里面的信息:
在这里插入图片描述
DependencyDescriptor 描述了我们要注入的目标的一些信息,申明类,字段名称,是否必须对应的就是Autowired的知否必须,eager是否是肌饿模式(实时注入),一般不用懒加载都是肌饿的。

注入过程

1 普通的字段注入

@Autowired
private Person person;
  • 字段注入前面的判断都会跳过进入到下面这个方法
    在这里插入图片描述

  • 让后进入的下一个核心方法

在这里插入图片描述
进入这个方法:
在这里插入图片描述
候选的Bean是通过上面这个方法找到的,并且返回的时候将Bean对象放入到Map中。
在这里插入图片描述
然后我们如果我们多个bean,determineAutowireCandidate这个方法会决定一个Bean,决定的方式为如果使用了Primary就注入PrimaryBean否则Ordered根据这个接口定义的优先级来寻找,数字越低优先级越高:
在这里插入图片描述
2 集合注入

@Autowired
private Collection<Person> personGroupAll;

集合注入核心逻辑会走到下面这个方法,这个方法返回的时候multipleBeans已经不为空了这个这个直接返回。
在这里插入图片描述
为什么上面可以直接返回呢,因为在resolveMultipleBeans方法中,判断了注入的类型如果是集合类型,也是走的一样的逻辑findAutowireCandidates找到候选的Bean进行返回。
在这里插入图片描述
3 懒加载

@Autowired
@Lazy
private Person person;

在懒注入的时候我们在这个方法已经有值了,所以逻辑在这一步就结束了,返回的是一个代理对象。
在这里插入图片描述
这个对象是cglib提升后的对象:
在这里插入图片描述

4 Optional注入

@Autowiredprivate Optional<Person> person;

核心逻辑是走下面

在这里插入图片描述
其实里面的逻辑是一样的,只是最后封装为Optional:
在这里插入图片描述

@Autowired的原理

会先调用AutowiredAnnotationBeanPostProcessor#postProcessMergedBeanDefinition
在这里插入图片描述
然后调用这个方法:
在这里插入图片描述

最后通过反射进行注入:
在这里插入图片描述

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

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

相关文章

Python标准库中的生成器函数大全(非常详细)

用于筛选的生成器函数 从输入的可迭代对象中产生项的子集,而且不修改项本身。多数可筛选生成器接收一个predicate参数。这个参数的值是个布尔函数,接收一个参数,应用到输入中的每一项上,用于判断项是否包含在输出中。 itertools.compress(it,selectors_it) 并行处理两个…

2024蓝桥杯CTF writeUP--cc

给了个网页&#xff0c;里面有加密算法&#xff0c;密钥&#xff0c;密文 使用在线解码工具 CTF最全在线工具整理_在线ctf工具-CSDN博客 将输出的密文&#xff0c;密钥&#xff0c;vi&#xff0c;加密方式一一对应

谈谈IP地址

IP地址 IP地址概念动态分配 IP(DHCP)NAT机制(网络转换机制)IPv6 IP地址组成特殊的IP地址 IP地址 IP协议报文结构: 概念 IP地址: 描述了主机的具体位置.有32位,利用点分十进制的方式来表示.例如: 192.168.190.77 32位ip地址表示的数据非常有限,42亿九千万…, 那么ip地址不够用…

学QT的第三天~

ikun登录界面完善 #include "mywidget.h" void MyWidget::bth1() { if(edit3 ->text()"520cxk"&&edit4 ->text()"1314520") { //1.实例化一个QmessageBox类的对象 QMessageBox box(QMessageBox::Information, //图标 "恭喜…

数据结构与算法(5)队列的基本操作

#include<stdio.h> #include<stdlib.h> #include<stdbool.h> typedef int ElemType; #define MaxSize 10//队列的定义 typedef struct SqQueue {ElemType data[MaxSize];int front, rear;//front为头指针&#xff0c;rear为尾指针。这里并不是真正的“指针”…

嵌入式数据库SQLite 3配置使用详细笔记教程

0、惨痛教训 随着管理开发的项目体积越来越庞大&#xff0c;产品系统涉及的数据量也越来越多&#xff0c;并且伴随着项目不久就要交付给甲方了。如果项目的数据信息没有被妥善管理&#xff0c;后期设备的运行状态、操作状况等数据流信息不能被溯源&#xff0c;当出现了一些特殊…

conll-2012-formatted-ontonotes-5.0中文数据格式说明

CoNLL-2012 数据格式是用于自然语言处理任务的一种常见格式&#xff0c;特别是在命名实体识别、词性标注、句法分析和语义角色标注等领域。这种格式在 CoNLL-2012 共享任务中被广泛使用&#xff0c;该任务主要集中在语义角色标注上。 CoNLL-2012 数据格式通常包括多列&#xf…

python:画饼图

我现在因工作需要在写一篇中文文章&#xff0c;领导要我用python处理数据和画图&#xff0c;那我也刚好学习一下python画图。 import matplotlib.pyplot as plt # 饼图数据 labels [A, B, C, D] sizes [15, 30, 45, 10] # 每个部分的大小 # 绘制饼图 plt.figure(figsize(6,…

Python项目开发实战:俄罗斯方块游戏(案例教程)

一、项目概述 俄罗斯方块(Tetris)是一款经典的益智游戏,它以其简单易懂的游戏规则和丰富的变化吸引了无数玩家。本项目旨在使用Python编程语言及其图形库Pygame来开发一个基础的俄罗斯方块游戏。通过本项目,我们将了解游戏开发的基本流程,掌握Python和Pygame的基本用法,并…

MySQL sql_mode引发的异常

背景介绍 项目代码在多个环境运行&#xff0c;其中一个环境有问题。一直报错sqlalchemy.exc.InternalError: (pymysql.err.InternalError) (3065, "Expression #2 of ORDER BY clause is not in SELECT list, references column xxx which is not in SELECT list; this i…

紧跟生成式AI暴雨发布新时代推理服务器

近日&#xff0c;暴雨发布最新训推一体AI服务器&#xff0c;以大容量内存和灵活的高速互连选项满足各种AI应用场景&#xff0c;最大可能支持扩展插槽&#xff0c;从而大幅提升智能算力性能&#xff0c;以最优的性能和成本为企业的模型训练推理落地应用提供更好的通用算力。 AIG…

软考系列必过资料分享-系统架构师-系统分析师-信息系统项目管理师

建议,写在前面 知识点是公用的,原则上不分新旧。每年会有少部分的题目切合当前时间段&#xff08;也是通过旧的知识演变的&#xff09; 信息系统项目管理师证书 系统架构师证书 系统分析师证书 资料分享 关注公众号 回复 信息系统项目管理师资料 即可获取信息系统项目管理师资…

【RAG 论文】Dense X 检索:将“命题”作为检索粒度

论文&#xff1a;Dense X Retrieval: What Retrieval Granularity Should We Use? ⭐⭐⭐⭐ Code: github.com/ct123098/factoid-wiki 文章目录 一、论文速读二、命题&#xff08;Proposition&#xff09;三、FactoidWiki四、实验及分析4.1 Passage Retrieval 任务4.2 Open-Do…

数据结构-线性表-链表-2.3-7

设在一个带头结点的单链表中所有元素的数据值无序&#xff0c;试编写一个函数&#xff0c;删除表中所有介于给定的两个值&#xff08;作为函数参数给出&#xff09;之间的元素的元素&#xff08;若存在&#xff09;。 无序链表&#xff0c;逐个结点进行检查&#xff0c;执行删…

VSCode-vue3.0-安装与配置-export default简单例子

文章目录 1.下载VSCode2.修改语言为中文3.辅助插件列表4.vue3模板文件简单例子5.总结 1.下载VSCode 从官网下载VSCode&#xff0c;并按下一步安装成功。 2.修改语言为中文 点击确认修改&#xff0c;如下图所示&#xff1a; 或者打开命令面板&#xff1a;输入Configure Displ…

党建教育vr虚拟现实展厅真正实现了绿色、低碳的展示方式

在数字化浪潮席卷的今天&#xff0c;传统企业门户官网已难以满足企业日益增长的展示需求。面对这一挑战&#xff0c;北京华锐凭借深厚的行业经验和领先的技术实力&#xff0c;为您提供全新的元宇宙虚拟展厅制作服务&#xff0c;助您轻松打破现实与虚拟的界限&#xff0c;开启企…

如何让vim支持python3

首先删除旧的vim。 sudo apt-get remove vim //输入re按下tab直接显示remove sudo apt-get remove vim-runtime sudo apt-get remove vim -tiny sudo apt-get remove vim-common 然后下载vim8源码&#xff1a; git clone https://github.com/vim/vim.git 进行编译安装…

【NodeMCU实时天气时钟温湿度项目 5】获取关于城市天气实况和天气预报的JSON信息(心知天气版)

| 今天是第五专题内容&#xff0c;主要是介绍如何从心知天气官网&#xff0c;获取包含当前天气实况和未来 3 天天气预报的JSON数据信息。 在学习获取及显示天气信息前&#xff0c;我们务必要对JSON数据格式有个深入的了解。 如您需要了解其它专题的内容&#xf…

C语言----杨辉三角

各位看官们好。学习到这里想必大家应该对C语言的了解也是很深刻的了吧。但是我们也不能忘记我们一起学习的知识啊。在我们以前学习C语言的时候我想大家应该都听说过杨辉三角吧。虽然我们把其中的规律找到那么这个代码就简单很多了。那么接下里我们就来讲讲杨辉三角。 首先我们先…

UltralSO制作启动盘时报错:磁盘/映像容量太小解决办法

UltralSO制作启动盘时报错&#xff1a;磁盘/映像容量太小解决办法 发现网上随便下载的UltralSO制作启动盘时报错&#xff1a;磁盘/映像容量太小&#xff0c;导致制作启动盘出错 解决方案&#xff1a; 去这个地址下载&#xff1a;https://cn.ultraiso.net/xiazai.html 下载正版…