想读懂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. Towards Network Anomaly Detection Using Graph Embedding笔记

    Towards Network Anomaly Detection Using Graph Embedding 目录 Towards Network Anomaly Detection Using G ...

  2. Python如何在日志中隐藏明文密码

    Python如何在日志中隐藏明文密码 前言 在项目开发中,有的时候会遇到一些安全需求,用以提升程序整体的安全性,提高外来非法攻击的门槛,而在日志中隐藏明文密码打印便是最典型的安全需求之一. 在Pyth ...

  3. 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(7) -- 图标列表展示和选择处理

    我们在WPF应用端的界面中,使用lepoco/wpfui 来做主要的入口框架,这个项目它的菜单内置了不少图标,我们需要在动态菜单的配置中,使用它作为图标的展示处理,本篇随笔介绍如何基于图标枚举集合进行 ...

  4. css 10-13

    1.背影样式 backgroud-color                   背景颜色 backgroud-color :red backgroud-image                 背 ...

  5. oceanbase 标量子查询等价改写(复杂)

    OB一哥们找我优化条SQL,反馈在OceanBase执行时间很慢需要 3184s才能出结果,安排. 原SQL: select M.POLICY_CHARGE_ID as policyChargeId, ...

  6. Navicat Premium破解工具及教程

    使用Navicat_Keygen_Patch5破解Navicat Premium 更新:2019-06-11 10:16 使用Navicat_Keygen_Patch_v5.0_By_DFoX破解Na ...

  7. Vue 项目部署到GitHub Pages并同步到Gitee Pages

    前言:相信很多前端开发者都拥有自己的vue项目,若想把自己的项目做成网站分享给大家看,最常用的就是利用Github提供的GitHub Pages服务和Gitee提供的Gitee Pages服务.其中, ...

  8. offscreenCanvas+worker+IndexedDB实现无感大量图片缓存

    一个有必要实现的需求 因为项目中需要使用canvasTexture(一个threejs3d引擎中的材质类型),绘制大量的图片,每次使用都会请求大量的oss图片资源,虽然重复请求会有磁盘缓存但毕竟这个磁 ...

  9. (Good topic)四因数 (leetcode 181周赛T2)

     四因数难度中等1收藏分享切换为英文关注反馈给你一个整数数组 nums,请你返回该数组中恰有四个因数的这些整数的各因数之和. 如果数组中不存在满足题意的整数,则返回 0 .   示例: 输入:nums ...

  10. freeswitch的一个性能问题

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. 在fs的使用过程中,会遇到各种各样的问题,各种问题中,性能问题是最头疼的. 最近在测试某些场景的时候,压测会造成fs的内存占用持续升 ...