Spring学习(三)IOC控制反转与DI依赖注入

2023-10-27

IOC(Inversion of Control,控制反转)是spring的核心,贯穿始终。
所谓IOC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系:
  • 传统开发模式:对象之间互相依赖
  • IOC开发模式:IOC容器安排对象之间的依赖
Spring所倡导的开发方式就是:所有的类都会在Spring容器当中登记,告诉Spring你是一个什么东西,你需要什么东西。
然后Spring会在系统运行到适当的时候把你所需要的东西主动送给你。
同时,也把你交给其他需要你的东西。
所有类的创建、销毁都由Spring控制。
也就是说:控制对象生存周期的不在是引用他的对象而是Spring。
对于某个具体的对象而言:以前是他控制其他对象,现在是所有的对象都被Spring所控制。
所以这就叫控制反转
接下来我们介绍以下IOC的理论背景
我们先来观察几张图:
图1:耦合的对象
图2:解耦的过程
图3:理想的系统
我们可以看到在软件系统在没有引入IOC容器之前就像图1所示,对象A依赖与对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动的去创建对象B,或者是使用已经创建的对象B。无论是创建还是使用对象B,控制权全都在自己手上。
在软件系统引入了IOC容器之后,这种情景就完全改变了。
那么如图2所示,由于IOC容器的加入,对象A和对象B之间失去了直接的联系。所以当对象A运行到了需要对象B 的时候,IOC容器会主动地创建一个对象B注入到对象A所需要的地方。
那么,通过前后的对比,我们不难看出:对象A获得对象 B的过程由主动行为变成了被动行为。控制权颠倒过来了,这就是控制反转。这就是其名称的由来。
而图3则是我们在开发过程中所期望看到的理想的系统。



既然IOC是控制反转,那么到底是哪些方面的控制被反转了呢?
获得依赖对象的过程被反转了。
控制被反转之后,获得依赖对象的过程由自身的管理变为了由IOC容器主动的注入。
于是,控制反转便有了一个更合适的名字,叫做:依赖注入(DI)
IOC的另外的名字叫做依赖注入(Dependency Injection),所谓的依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。所以,依赖注入(DI)控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。

我们来举一个生活当中常见的例子来解释下什么是依赖注入:
大家对USB设备和USB接口应该都很熟悉,USB为我们使用电脑提供了很大的方便。现在有很多的外部设备都支持USB设备。
现在我们利用主机接口和USB设备来实现一个任务:从我们的USB设置读取一个文件
电脑主机读取文件时他一点也不关心电脑主机上连接的是什么设备,而且他确实也没有必要知道。他的任务就是读取USB接口,挂接的设备只要符合USB接口的标准就可以了。所以我给电脑主机连接上一个U盘,那么主机就从U盘上读取文件。那么我给主机连接上一个外置硬盘,那么电脑便从外置硬盘上读取文件。挂接外部设备的权利来由我做主,即控制权是归我的。至于USB接口挂接的是什么设备电脑主机是决定不了的,他只能被动的接收。当电脑主机需要外部设备时根本不用他告诉我,我会主动的为他挂接上他所需要的外部设备。
这就是我们生活当中常见的一个依赖注入的例子。在整个过程中,我就起到了一个IOC容器的作用。
通过这个例子,依赖注入的思路就已经非常清楚了:
当电脑主机读取文件的时候,我就将他所要依赖的外部设备帮他挂接上。整个外部设备注入的过程和一个被依赖的对象在系统运行是被注入到另一个对象内部的过程是完全一样的。
我们把依赖注入应用到软件系统当中再来描述一下这个过程是什么样子的:
对象A依赖与对象B,那么当对象A需要用到对象B 的时候,IOC容器就会立即的创建一个对象B送给对象A。
IOC的容器就是一个对象制造工程,你需要什么,他就会传送给你,你直接使用就可以了。再也不用关心你所需要的东西是如何制成的,也不用关心最后是怎么被销毁的。这一切都全部由IOC容器来包办,在传统的实现中由程序内部代码来控制组件之间的关系,我们经常使用new关键字来实现两个组件之间关系的组合,这种实现方式会造成组件之间耦合。IOC很好的解决了这种问题,他将实现组件间到的关系由程序内部提炼到了程序外部。也就是说由容器在运行期间将组件间的某种依赖关系动态的注入到组件当中。
那么IOC到底给我们的编码过程中带来了什么样的好处呢?
IOC在编程过程中不会对业务对象构成很强的侵入性,
使用IOC之后,对象具有更好的可实行性,可重用性和可扩展性:
  • 降低组件之间的耦合度
  • 提高开发效率和产品质量
  • 统一标准,提高模块的复用性
  • 模块具有热插拔特性
总结:
IOC的通俗理解如下:
•    IOC(控制反转):说的是创建对象实例的控制权从代码控制剥离到IOC容器控制,实际就是你在xml文件控制,侧重于原理
•    DI(依赖注入):说的是创建对象实例时,为这个对象注入属性值或其它对象实例,侧重于实现
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring学习(三)IOC控制反转与DI依赖注入 的相关文章

随机推荐

  • 【CUDA学习】__syncthreads的理解

    syncthreads 是cuda的内建函数 用于块内线程通信 syncthreads is you garden variety thread barrier Any thread reaching the barrier waits u
  • BUUCTF学习笔记-Secret File

    BUUCTF学习笔记 Secret File 时间 2020 09 28 考点 文件包含 打开页面没发现特别的内容 右键查看源代码才发现下面隐藏了一个a标签只是字体颜色改成了和背景色一样 标签跳转到另外一个页面Archive room ph
  • C语言实现图的邻接矩阵存储结构及深度优先遍历和广度优先遍历

    DFS的核心思想在于对访问的邻接节点进行递归调用 BFS的核心思想在于建立了一个邻接节点的队列 在Dev C 中调试运行通过 用下图进行了测试 include
  • Python里面的[::-1]和[::2]是什么意思

    Python里面的 1 和 2 是什么意思 来源 https docs python org 2 3 whatsnew section slices html L range 10 L 2 0 2 4 6 8 L 1 9 8 7 6 5 4
  • 使用Vue+xlsx+xlsx-style实现导出自定义样式的Excel文件

    本文就是上一篇 使用Python openpyxl实现导出自定义样式的Excel文件 文章中提到的 之前项目的导出Excel文件操作都是在前端完成的 这段话中基于前端实现的导出Excel文件方法 文档地址 https docs sheetj
  • python中circle函数的用法,python画圆运用了什么函数

    python画圆运用了matplotlb库的figure 和Circle 函数 其中 figure 函数用于确定画布大小 而Circle 函数用于配置圆的相关信息 进而画圆 本教程操作环境 windows7系统 Python3版 Dell
  • MySQL多表操作练习题

    数据准备 CREATE table dept deptno INT PRIMARY KEY dname VARCHAR 14 loc VARCHAR 13 INSERT INTO dept VALUES 10 accounting new
  • QT开发(十九)——QT内存泄漏问题

    QT开发 十九 QT内存泄漏问题 一 QT对象间的父子关系 QT最基础和核心的类是 QObject QObject内部有一个list 会保存children 还有一个指针保存parent 当自己析构时 会自己从parent列表中删除并且析构
  • Java 反射 与 主要API

    控制你的大脑 控制你的行为 你会得到更多 收获很多 文章目录 一 反射相关的主要API 二 代码例子演示 三 反射测试类 一 反射相关的主要API API 名称 代表含义 Java lang class 代表一个类 java lang re
  • J-Tech Talk | 6.29首播 Python文档漫谈

    J Tech Talk 由 Jina AI 社区为大家带来的技术分享 围绕 Python 人工智能 深度学习等 给大家带来针对具体实战型问题的讲解 分享 Jina AI 在开发过程中所积累的经验 Github 的开源项目数不胜数 想要扩大项
  • 使用OPENLDAP C API修改 win2003 AD域(Active Directory)用户密码

    参考 http blog csdn net wzhwho article details 6209693 参考 http www 121 name LDAP html 参考 http pig made it com pig adusers
  • 单片机学习笔记1:单片机简介

    单片机 1 什么是单片机 单片机 Single Chip Microcomputer 是一种集成电路芯片 是采用超大规模集成电路技术把具有数据处理能力的中央处理器 CPU 存储器 RAM ROM 中断系统 I O接口电路 定时器 计数器等功
  • 图像分类(1),数据预处理

    本文介绍如何使用pytorh利用预训练模型进行图像分类 主要参考Transfer Learning Tutorial和 具体代码可以参考Image classification 下载代码文件 git clone https github c
  • Web自动化测试,怎样参数化?

    目录 1 读取 csv 文件 2 数据ddt参数化 2 1实施步骤 2 2代码举例 unittest框架 3 PO 模式 3 1介绍 3 2非po模式和po模式对比 3 3Po分层及彼此关系 3 4代码举例 非PO模式 3 5代码举例 PO
  • 计算机开机后发现不了硬盘 首先应该检查,电脑每次开机都检测硬盘,怎么关闭这项功能?...

    如何关闭硬盘开机检测 开机自检时可以通过以下方法关闭硬盘的智能状态 不检测是无法实现的 hard disk state at all 1 Boot into bios 通常按f1 f2 f9 del 键进入bios 2 在boot或adva
  • torch一些常见的环境问题

    前言 我们在使用torch的时候经常会遇到一些常见的错误 这里单独开一篇博客记录一下 以便日后翻阅 本文会不断更新 torch1 13 有时候pip 下某个包的时候经常会自动安装nvidia cublas cu11 11 10 3 66 于
  • const int *p和int * const p的区别(常量指针与指向常量的指针)

    对于指针和常量 有以下三种形式都是正确的 const char myPtr char A 指向常量的指针 char const myPtr char A 常量的指针 const char const myPtr char A 指向常量的常量
  • Kali使用Netdiscover探测局域网中存活主机

    1 netdiscover介绍 Netdiscover 是一个主动 被动的ARP 侦查工具 使用Netdiscover工具可以在网络上扫描IP地址 检查在线主机或搜索为它们发送的ARP请求 2 主动模式 主动模式顾名思义就是主动的探测发现网
  • 使用键值表实现通用流水号

    很多MIS系统 都需要用到流水号 一般的简单的流水号 由标识 日期 自增序号来组成 但如果考虑通用的话 就稍微复杂点儿的 需要考虑自定义日期格式 自增序号归1 自增序号溢出处理 前缀 中缀 后缀 并发访问 批量获取等 本文抽象出一个通用的生
  • Spring学习(三)IOC控制反转与DI依赖注入

    IOC Inversion of Control 控制反转 是spring的核心 贯穿始终 所谓IOC 对于spring框架来说 就是由spring来负责控制对象的生命周期和对象间的关系 传统开发模式 对象之间互相依赖 IOC开发模式 IO