一文读懂Spring框架中依赖注入流程

想读懂Spring的依赖注入流程,我们先简单了解一下Ioc和DI是什么?

IoC和DI

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

依赖注入流程图:

一文读懂Spring框架中依赖注入流程

根据依赖注入流程图简单解释:

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

一文读懂Spring框架中依赖注入流程

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

一文读懂Spring框架中依赖注入流程

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

一文读懂Spring框架中依赖注入流程

3.2.然后继续存入 MutablePropertyValue(List

4.Bean的属性注入(BeanWrapperImp) 先从PropertyAccessor(属性访问器)获取属性名称 然后获取指定的属性访问器去操作属性的注入:

AbstractNestablePropertyAccessor的getPropertyAccessorForPropertyPath()的内部处理来获取属性访问器:

一文读懂Spring框架中依赖注入流程

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

一文读懂Spring框架中依赖注入流程

PropertyTokenHolder是什么?

  • 用于解析嵌套属性名称,标识唯一的属性
  • 解析后将 [] 之间的 '" 去除后保存在 canonicalName 中,attrs 保存在 actualName 中,[“key”, “0”] 保存在 keys 中

一文读懂Spring框架中依赖注入流程

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

一文读懂Spring框架中依赖注入流程

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

一文读懂Spring框架中依赖注入流程

不要白嫖点个赞 谢谢了!!!!

Original: https://www.cnblogs.com/yunjie0930/p/15418198.html
Author: 小杰i
Title: 一文读懂Spring框架中依赖注入流程

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/576384/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 计算机网络 | TCP 连接的建立 和 TCP 连接的断开

    TCP 连接的建立过程 一开始,客户端和服务端都处于 close 状态。 先是服务端监听某个端口,此时服务端处于 listen 状态。 这个时候客户端就可以发送连接请求报文了。 第…

    数据库 2023年6月11日
    0126
  • SQL语言的总结

    SQL语言分类:1.数据查询语言(DQL:Data Query Language),也称为”数据检索语句”,用以从表中查询获得数据,常用关键字SELECT …

    数据库 2023年5月24日
    083
  • gauss杀进程

    1)查询当前所有连接的状态 select datname,pid,application_name,state from pg_stat_activity; 2)关闭当前state…

    数据库 2023年6月16日
    092
  • mydumper备份mysql8.0 sql thread被kill掉

    这个问题是很久以前的事了。今天,我看了看我的笔记,发现了这个问题。我当时没有仔细看过它。我现在就想复制它。 [En] This problem was a long time ag…

    数据库 2023年5月24日
    0113
  • 云数据库技术行业动态@2022-09-30

    重要更新 时序数据库厂商「格睿云Greptime」已于近期完成天使轮融资。据介绍,本轮融资金额在数百万美金级别,由耀途资本领投,九合创投跟投。Greptime成立于2022年4月,…

    数据库 2023年6月11日
    0108
  • AI听曲识歌!哼曲、口哨吹,都能秒识! ⛵

    💡 作者:韩信子@ShowMeAI📘 深度学习实战系列:https://www.showmeai.tech/tutorials/42📘 自然语言处理实战系列:https://www…

    数据库 2023年6月14日
    0103
  • Redis-主从

    数据库的发展总是从 单机 -> 主从 -> 分片集群 Redis的主从复制 从单机到主从的根本优势在于: 可实现读写分离,分摊读压力;某个从库用于做统计等后台功能 数据…

    数据库 2023年6月11日
    0102
  • Nginx 配置参数优化

    nginx 配置参数优化 nginx作为高性能web服务器,即使不特意调整配置参数也可以处理大量的并发请求。以下的配置参数是借鉴网上的一些调优参数,仅作为参考,不见得适于你的线上业…

    数据库 2023年6月6日
    090
  • 操作系统(学习笔记)

    操作系统(学习笔记) PCB=process control block=进程控制块,用于存储进程相关信息,以便进程切换; GDT=global descriptor table=…

    数据库 2023年6月14日
    078
  • 小心陷入MySQL索引的坑

    索引可以说是数据库中的一个大心脏了,如果说一个数据库少了索引,那么数据库本身存在的意义就不大了,和普通的文件没什么两样。所以说一个好的索引对数据库系统尤其重要,今天来说说MySQL…

    数据库 2023年6月6日
    093
  • win10彻底永久关闭自动更新的方法【已验证有效】

    [知识整理/来源网络] 原文链接:win10彻底永久关闭自动更新的方法【已验证有效】_电脑知识-电脑配置网 (dnpz.net) win10的自动更新可谓是非常顽固,很多用户在网上…

    数据库 2023年6月9日
    0111
  • Linux–>文件目录作用查询

    在Linux中他的根目录都是决定好的无法改名,并且每一个目录他的作用都是决定好的 在Linux中一切都是文件!,Linux会把所有的硬件都映射成文件 代表根目录 /bin /bin…

    数据库 2023年6月14日
    0106
  • 001从零开始入门Entity Framework Core——基础知识

    1、对于 EF Core,使用模型执行数据访问。 模型由 实体类和表示数据库会话的 上下文对象构成。 上下文对象允许查询并保存数据。 2、EF 支持以下模型开发方法: 从现有数据库…

    数据库 2023年6月14日
    093
  • nexus,docker服务器限制外网时,需要添加的例外

    Mavenhttps://maven.aliyun.com/https://repo.maven.apache.org Dockerhttps://hub.docker.com/h…

    数据库 2023年6月9日
    0103
  • Consul 入门-运行

    HashiCorp Consul 是由 HashiCorp 公司开发的,它是一家专注于 DevOps 工具链的公司,旗下的明星级产品包括 Vagrant、Terraform、Vau…

    数据库 2023年6月6日
    078
  • 我竟然才知道slf4j里还有个MDC

    大家好久不见,我是walking。今天给大家带来一个日志方面的知识——MDC,不知道大家认识不,反正我是最近刚知道的😂 初见MDC 前两天看项目中的代码,无意中看到一个自定义的线程…

    数据库 2023年6月11日
    0147
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球