想读懂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框架中依赖注入流程的更多相关文章

  1. 一文读懂Asp.net core 依赖注入(Dependency injection)

    一.什么是依赖注入 首先在Asp.net core中是支持依赖注入软件设计模式,或者说依赖注入是asp.net core的核心: 依赖注入(DI)和控制反转(IOC)基本是一个意思,因为说起来谁都离不 ...

  2. 一文读懂高性能网络编程中的I/O模型

    1.前言 随着互联网的发展,面对海量用户高并发业务,传统的阻塞式的服务端架构模式已经无能为力.本文(和下篇<高性能网络编程(六):一文读懂高性能网络编程中的线程模型>)旨在为大家提供有用的 ...

  3. 一文读懂神经网络训练中的Batch Size,Epoch,Iteration

    一文读懂神经网络训练中的Batch Size,Epoch,Iteration 作为在各种神经网络训练时都无法避免的几个名词,本文将全面解析他们的含义和关系. 1. Batch Size 释义:批大小, ...

  4. 一文读懂数仓中的pg_stat

    摘要:GaussDB(DWS)在SQL执行过程中,会记录表增删改查相关的运行时统计信息,并在事务提交或回滚后记录到共享的内存中.这些信息可以通过 "pg_stat_all_tables视图& ...

  5. Spring 框架中Http请求处理流程

    Spring Web http request请求流程: 首先介绍这边你需要知道的继承体系,DispacherServlet继承自FrameworkServlet,FrameworkServlet继承 ...

  6. 一文读懂 Spring Boot、微服务架构和大数据治理三者之间的故事

    微服务架构 微服务的诞生并非偶然,它是在互联网高速发展,技术日新月异的变化以及传统架构无法适应快速变化等多重因素的推动下诞生的产物.互联网时代的产品通常有两类特点:需求变化快和用户群体庞大,在这种情况 ...

  7. 干货|一文读懂 Spring Data Jpa!

    有很多读者留言希望松哥能好好聊聊 Spring Data Jpa!其实这个话题松哥以前零零散散的介绍过,在我的书里也有介绍过,但是在公众号中还没和大伙聊过,因此本文就和大家来仔细聊聊 Spring D ...

  8. 一文读懂spring boot 和微服务的关系

    欢迎访问网易云社区,了解更多网易技术产品运营经验. Spring Boot 和微服务没关系, Java 微服务治理框架普遍用的是 Spring Cloud. Spring Boot 产生的背景,是开发 ...

  9. 采用dom4j和反射模拟Spring框架的依赖注入功能

    Spring的依赖注入是指将对象的创建权交给Spring框架,将对象所依赖的属性注入进来的行为.在学习了dom4j后,其实也可以利用dom4j和反射做一个小Demo模拟Spring框架的这种功能.下面 ...

  10. spring框架之依赖注入(DI)

    1. IOC和DI的概念 * IOC -- Inverse of Control,控制反转,将对象的创建权反转给Spring!! * DI -- Dependency Injection,依赖注入,在 ...

随机推荐

  1. SQL运用full join连接,decode函数,nvl函数进行列转行

    背景说明:full join连接,decode函数,nvl函数,结合生产背景理解更深刻: test_A表是现金业主某时间段的收益:test_B表是非现金业主某时间段的收益:对于业主,test_A表与t ...

  2. 教育法学第九章单元测试MOOC

    第九章单元测试 返回 本次得分为:100.00/100.00, 本次测试的提交时间为:2020-09-06, 如果你认为本次测试成绩不理想,你可以选择 再做一次 . 1 单选(5分) 作为教师最基本的 ...

  3. vue框架,input相同标签如何定位-label定位

    一.问题提出: 后台前端框架改版,之前是angularjs,现在用vue,导致input标签定位失败,只能定位到第一个input标签,查看后台源代码发现这两个标签是一模一样,如下图: 二.问题思考过程 ...

  4. 使用 GitHub Action 自动更新 Sealos 集群的应用镜像

    在 IT 领域,自动化无疑已成为提高工作效率和减少人为错误的关键.Sealos 作为一个强大的云操作系统,已经为许多企业和开发者提供了稳定可靠的服务.与此同时,随着技术不断发展,集成更多的功能和服务变 ...

  5. Python网页应用开发神器fac 0.2.10版本新功能介绍

    fac项目地址:https://github.com/CNFeffery/feffery-antd-components 欢迎star支持 大家好我是费老师,由我开源维护的Python网页通用组件库f ...

  6. Go 常用标准库之 fmt 介绍与基本使用

    Go 常用标准库之 fmt 介绍与基本使用 目录 Go 常用标准库之 fmt 介绍与基本使用 一.介绍 二.向外输出 2.1 Print 系列 2.2 Fprint 系列 2.3 Sprint 系列 ...

  7. 用结构化思维解一切BUG(3):实际案例

    背景 本文是系列文章<用结构化思维解一切BUG>的第 3 篇,也是最高潮篇!本系列文章主要介绍一种「无需掌握技术细节,只需结构化思维和常识即可解一切BUG的方法」. 在前序文章<用结 ...

  8. 【译】NoClassDefFoundError和ClassNotFoundException的不同(转)

    https://www.jianshu.com/p/93d0db07d2e3 本文翻译自:Difference between NoClassDefFoundError vs ClassNotFoun ...

  9. Python 潮流周刊#25:性能最快的代码格式化工具 Ruff!

    你好,我是猫哥.这里每周分享优质的 Python.AI 及通用技术内容,大部分为英文.标题取自其中一则分享,不代表全部内容都是该主题,特此声明. 本周刊由 Python猫 出品,精心筛选国内外的 25 ...

  10. 【Unity】 ScriptableObject ——生成多个ScriptableObject作为子对象,可以点击展开并显示二级菜单

    官方是这么介绍ScriptabelObject的: "ScriptableObject 是一个可独立于类实例来保存大量数据的数据容器.ScriptableObject 的一个主要用例是通过避 ...