一文读懂Spring框架中依赖注入流程
想读懂Spring的依赖注入流程,我们先简单了解一下Ioc和DI是什么?
IoC和DI
- Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想
- Ioc就是将你设计好的对象交给容器来进行管理
- DI—Dependency Injection,即“依赖注入”:组件之间依赖关系由容器在运行期决定
- DI就是由容器动态的将某个依赖关系注入到组件之中
- 简单来说就是不通过new()的方式在类内部创建依赖对象,而是将依赖的类对象在外部创建好通过构造方法,函数参数等方式传递给类使用
- 依赖注入的方式有3种:
- 接口注入(调用和实现分离):不常用
- setter注入 (使用set方法为属性赋值)
- 构造器注入(通过构造方法赋值)(不能解决循环依赖的问题)
依赖注入流程图:

根据依赖注入流程图简单解释:
1.依赖注入的步骤在Bean实例化之后就进行依赖注入了:可以根据Bean的生命周期流程图可知:

2.依赖注入入口:AbstractAutowireCapableBeanFactory的docreateBean()方法中的populateBean(beanName, mbd, instanceWrapper);
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
throws BeanCreationException {
// Initialize the bean instance.
Object exposedObject = bean;
try {
// bean初始化第二步:填充属性(DI依赖注入发生在此步骤)
// 调用反射和内省去进行属性设置
// 属性值需要进行类型转换,判断属性注入是否需要
populateBean(beanName, mbd, instanceWrapper);
// bean初始化第三步:调用初始化方法,完成bean的初始化操作(AOP发生在此步骤)
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
}
3.先进行一个bean的属性值的类型的转换(就是配置文件->依赖注入的类型) 转换之前存储的是 MutablePropertyValue(List<PropertyValue>)

3.1.然后中间经过BeanDefinitionValueResolve来进行转换:

3.2.然后继续存入 MutablePropertyValue(List<PropertyValue>)中:
4.Bean的属性注入(BeanWrapperImp) 先从PropertyAccessor(属性访问器)获取属性名称 然后获取指定的属性访问器去操作属性的注入:
AbstractNestablePropertyAccessor的getPropertyAccessorForPropertyPath()的内部处理来获取属性访问器:

流程是先通过AbstractNestablePropertyAccessor的setpropertyValue()方法:

PropertyTokenHolder是什么?
- 用于解析嵌套属性名称,标识唯一的属性
- 解析后将 [] 之间的
'和"去除后保存在 canonicalName 中,attrs 保存在 actualName 中,["key", "0"] 保存在 keys 中

再判断PropertyTokenHolder的keys()为不为空是进行其他属性注入还是普通属性注入:

最后属性注入的核心逻辑是通过AbstractNestablePropertyAccessor的setPropertyValue()来进行注入逻辑的:

不要白嫖点个赞 谢谢了!!!!
一文读懂Spring框架中依赖注入流程的更多相关文章
- 一文读懂Asp.net core 依赖注入(Dependency injection)
一.什么是依赖注入 首先在Asp.net core中是支持依赖注入软件设计模式,或者说依赖注入是asp.net core的核心: 依赖注入(DI)和控制反转(IOC)基本是一个意思,因为说起来谁都离不 ...
- 一文读懂高性能网络编程中的I/O模型
1.前言 随着互联网的发展,面对海量用户高并发业务,传统的阻塞式的服务端架构模式已经无能为力.本文(和下篇<高性能网络编程(六):一文读懂高性能网络编程中的线程模型>)旨在为大家提供有用的 ...
- 一文读懂神经网络训练中的Batch Size,Epoch,Iteration
一文读懂神经网络训练中的Batch Size,Epoch,Iteration 作为在各种神经网络训练时都无法避免的几个名词,本文将全面解析他们的含义和关系. 1. Batch Size 释义:批大小, ...
- 一文读懂数仓中的pg_stat
摘要:GaussDB(DWS)在SQL执行过程中,会记录表增删改查相关的运行时统计信息,并在事务提交或回滚后记录到共享的内存中.这些信息可以通过 "pg_stat_all_tables视图& ...
- Spring 框架中Http请求处理流程
Spring Web http request请求流程: 首先介绍这边你需要知道的继承体系,DispacherServlet继承自FrameworkServlet,FrameworkServlet继承 ...
- 一文读懂 Spring Boot、微服务架构和大数据治理三者之间的故事
微服务架构 微服务的诞生并非偶然,它是在互联网高速发展,技术日新月异的变化以及传统架构无法适应快速变化等多重因素的推动下诞生的产物.互联网时代的产品通常有两类特点:需求变化快和用户群体庞大,在这种情况 ...
- 干货|一文读懂 Spring Data Jpa!
有很多读者留言希望松哥能好好聊聊 Spring Data Jpa!其实这个话题松哥以前零零散散的介绍过,在我的书里也有介绍过,但是在公众号中还没和大伙聊过,因此本文就和大家来仔细聊聊 Spring D ...
- 一文读懂spring boot 和微服务的关系
欢迎访问网易云社区,了解更多网易技术产品运营经验. Spring Boot 和微服务没关系, Java 微服务治理框架普遍用的是 Spring Cloud. Spring Boot 产生的背景,是开发 ...
- 采用dom4j和反射模拟Spring框架的依赖注入功能
Spring的依赖注入是指将对象的创建权交给Spring框架,将对象所依赖的属性注入进来的行为.在学习了dom4j后,其实也可以利用dom4j和反射做一个小Demo模拟Spring框架的这种功能.下面 ...
- spring框架之依赖注入(DI)
1. IOC和DI的概念 * IOC -- Inverse of Control,控制反转,将对象的创建权反转给Spring!! * DI -- Dependency Injection,依赖注入,在 ...
随机推荐
- 记一次 .NET 某餐饮小程序 内存暴涨分析
一:背景 1. 讲故事 前些天有位朋友找到我,说他的程序内存异常高,用 vs诊断工具 加载时间又太久,让我帮忙看一下到底咋回事,截图如下: 确实,如果dump文件超过 10G 之后,市面上那些可视化工 ...
- redis 源码分析:Jedis 哨兵模式连接原理
1. 可以从单元测试开始入手 查看类JedisSentinelPool private static final String MASTER_NAME = "mymaster"; ...
- Flask框架——Flask脚本、flask知识点补充
文章目录 Flask_脚本 1 集成Python shell 1.1 flask-script的用法: 1.1.1 实例:flask-script的简单实现 1.1.1命令添加方式: 第一种(无参命令 ...
- MQ系列15:MQ实现批量消息处理
MQ系列1:消息中间件执行原理 MQ系列2:消息中间件的技术选型 MQ系列3:RocketMQ 架构分析 MQ系列4:NameServer 原理解析 MQ系列5:RocketMQ消息的发送模式 MQ系 ...
- LVS负载均衡概念+三种模式
1.LVS负载均衡概念剖解: 1)LVS技术全称:Linux virtual Server ,Linux虚拟机服务器集群,1998由章文嵩博士设计.并且开源的,是中国最早的开源软件项目之一. 2) ...
- docker容器管理脚本
#!/bin/bash #auto install docker and Create VM #by jfedu.net 2017 #Define PATH Varablies IPADDR=`ifc ...
- k8s-服务网格实战-入门Istio
背景 终于进入大家都比较感兴趣的服务网格系列了,在前面已经讲解了: 如何部署应用到 kubernetes 服务之间如何调用 如何通过域名访问我们的服务 如何使用 kubernetes 自带的配置 Co ...
- CSP 2023 游只因
CSP \(2023\) 游只因 前面不写太多. Day \(-\frac{114514}{191}\) 雅礼(HN 四大名校)集训. Day 1:考试,讲题,改题. Day 2:考试,讲题,改题. ...
- 电路中的N.M.缩写含义
国外的一些电路中会发现在一些器件旁会有 N.M. 的标注. N.M. = Not Mount
- 16个值得推荐的.NET ORM框架(含使用情况统计的投票,欢迎参与)
什么是ORM? ORM 是 Object Relational Mapping 的缩写,译为"对象关系映射",是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的 ...