对IOC和DI的通俗理解

2023-11-08

      学习过spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC 、DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解。首先要分享的一位技术牛人对Spring框架的IOC的理解,写得非常通俗易懂,以下内容全部来自原文,原文地址:http://jinnianshilongnian.iteye.com/blog/1413846。

 

1、IOC是什么

     IOC—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们来深入分析一下:

谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IOC是有专门一个容器来创建这些对象,即由IOc容器来控制对象的创建而不再显式地使用new;谁控制谁?当然是IOC容器控制了对象;控制什么?那就是主要控制了外部资源获取和生命周期(不只是对象也包括文件等)。


为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。


用图例说明一下,传统程序设计如图1,都是主动去创建相关对象然后再组合起来:

图1 传统应用程序结构图

当有了IOC的容器后,在客户端类中不再主动去创建这些对象了,程序的结构图变成如图2所示:

图2 有IOC容器后的程序结构图

 

2、IoC能做什么

     IOC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IOC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

     其实IOC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IOC/DI思想中,应用程序就变成被动的了,被动的等待IOC容器来创建并注入它所需要的资源了。

     IOC很好的体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IOC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。

3、IOC和DI

     DI—Dependency Injection,即“依赖注入”:是组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。
理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”,那我们来深入分析一下:

 

谁依赖于谁:当然是应用程序依赖于IOC容器;
为什么需要依赖:应用程序需要IOC容器来提供对象需要的外部资源;
谁注入谁:很明显是IOC容器注入应用程序某个对象,应用程序依赖的对象;
注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。


IOC和DI有什么关系呢?其实它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对IOC而言,“依赖注入”明确描述了“被注入对象依赖IOC容器配置依赖对象”。

     看过很多对Spring的Ioc理解的文章,好多人对Ioc和DI的解释都晦涩难懂,反正就是一种说不清,道不明的感觉,读完之后依然是一头雾水,看完这位技术牛人的博客后有一种豁然开朗的研究,他清楚地解释了IOC(控制反转) 和DI(依赖注入)中的每一个字,读完之后给人一种豁然开朗的感觉。我相信对于初学Spring框架的人对IOC的理解应该是有很大帮助的。

4、IOC和DI的意义

     在平时的Java应用开发中,我们要实现某一个功能或者说是完成某个业务逻辑时至少需要两个或以上的对象来协作完成,在没有使用Spring的时候,每个对象在需要使用他的合作对象或者依赖对象时,自己均要使用像new object() 这样的语法来将合作对象创建出来,这个合作对象是由自己主动创建出来的,创建合作对象的主动权在自己手上,自己需要哪个合作对象,就主动去创建,创建合作对象的主动权和创建时机是由自己把控的,而这样就会使得对象间的耦合度高了,A对象需要使用合作对象B来共同完成一件事,A要使用B,那么A就对B产生了依赖,也就是A和B之间存在一种耦合关系,并且是紧密耦合在一起,而使用了Spring之后就不一样了,创建合作对象B的工作是由Spring来做的,Spring创建好B对象,然后存储到一个容器里面,当A对象需要使用B对象时,Spring就从存放对象的那个容器里面取出A要使用的那个B对象,然后交给A对象使用,至于Spring是如何创建那个对象,以及什么时候创建好对象的,A对象不需要关心这些细节问题(你是什么时候生的,怎么生出来的我可不关心,能帮我干活就行),A得到Spring给我们的对象B之后,两个人一起协作完成要完成的工作即可。

  所以控制反转IOC(Inversion of Control)是说创建对象的控制权进行转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权力转移到第三方,比如转移交给了IOC容器,它就是一个专门用来创建对象的工厂,你要什么对象,它就给你什么对象,有了 IOC容器,依赖关系就变了,原先的依赖关系就没了,它们都依赖IOC容器了,通过IOC容器来建立它们之间的关系。
  DI(依赖注入)其实就是IOC的另外一种说法,DI是由Martin Fowler 在2004年初的一篇论文中首次提出的。他总结道:控制的什么被反转了?就是获得依赖对象的方式反转了。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对IOC和DI的通俗理解 的相关文章

随机推荐

  • 第7章 指针 第1题

    题目 用原型 void getDate int dd int mm int yy 写一个函数 从键盘读入一个形如dd mmm yy的日期 其中dd是一个1位或2位的表示日的整数 mmm是月份的3个字母的缩写 yy是两位数的年份 函数读入这个
  • teamviewer连接不上的原因及解决方法有哪些

    teamviewer连接不上的原因及解决方法有哪些 一 总结 一句话总结 这里说的就是版本问题 高版本可以连接低版本 低版本无法连接高版本 1 TeamViewer官方检测使用环境是否为商用的标准是什么 1 自安装软件以来 累计连接的电脑多
  • 这个人就是吴恩达(Andrew Ng),百度新任首席科学家

    这个人就是吴恩达 Andrew Ng 百度新任首席科学家 虎嗅 2013 05 11 10 32 收藏43 评论35 虎嗅注 人工智能现在是科技界最前沿的话题之一 以谷歌为代表 科技巨头均在这个方向上进行巨大投入 虎嗅曾发表过一篇文章 谷歌
  • 【神兵利器】介绍一款基于GPT-4完全免费的编程软件:Cursor!

    Cursor 一款基于GPT 4完全免费的编程软件 PS 文章首发于公众号 字节卷动 官网地址 官网 https www cursor so IDE作者 https twitter com amanrsanger 这是我找到的第一个免费的
  • python比较两个csv文件,并打印出不同的行号,列号,数据

    https blog csdn net The Handsome Sir article details 121251433 def compareFile file1 file2 如果相等返回 1 0 0 如果不相等返回 0 a b a
  • 【满分】【华为OD机试真题2023 JS】AI处理器组合

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 AI处理器组合 知识点数组 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 某公司研发了一款高性能AI处理器 每台物理设备具备8颗AI处理器 编号分别为0 1 2
  • Y形电路与三角电路转换,网孔和节点分析法

    Y形电路与三角电路转换 网孔和节点分析法 Y形电路与三角电路转换 推导过程与之前的电压源和电流源的转换类似 用系数相等即可等价转换 此处直接给出结论与记法 网孔分析法 自电阻 在这个网孔中所有电阻的和 互电阻 网孔1与网孔2之间的电阻 将每
  • 机器学习——决策树算法

    一 实验目的 掌握如何实现决策树算法 用并决策树算法完成预测 二 实验内容 本次实验任务我们使用贷款申请样本数据表 该数据表中每列数据分别代表ID 年龄 高薪 有房 信贷情况 类别 我们根据如下数据生成决策树 使用代码来实现该决策树算法 三
  • Linux->线程库接口

    目录 前言 1 进程和线程 2 线程库接口 2 1 线程库基础理解 2 2 创建线程 2 2 线程资源回收 2 3 线程分离 前言 本篇主要是对Linux原装线程库的函数接口进行学习 还有一部分的线程概念补充 1 进程和线程 博主在上一篇文
  • android--emo的来源

    文章目录 前言 第一次安装 bug出现了 idea配置android开发环境 碰运气 重新下载 导入项目 测试成功 感悟 前言 记录一下我安装android studio的心路历程 为什么就我遇到这么多问题 第一次安装 这学期新开的移动应用
  • python选择与循环结构之判断三角形:任意输入三个整数作为三角形边长,判断三条边能否构成三角形,并判断是等边三角形、等腰三角形,直角三角形,还是一般三角形。

    问题描述 任意输入三个整数作为三角形边长 判断三条边能否构成三角形 并判断是等边三角形 等腰三角形 直角三角形 还是一般三角形 实现代码如下 a int input 请输入a b int input 请输入b c int input 请输入
  • Winsock Error Codes

    Winsock Error Codes 10004 WSAEINTRInterrupted function call This error indicates that a blocking call was interrupted by
  • JavaScript 严格模式(use strict)

    JavaScript严格模式 又称为 use strict 模式 是JavaScript语言的一种更严格的运行模式 严格模式规定了一些限制 用于防止程序员犯一些常见的错误 以保证代码的正确性和安全性 在JavaScript严格模式中 不允许
  • 刷脸支付智慧经营创业红利赢在坚持不懈

    这是一个最好的时代 我们身处繁华的都市 有着一个体面稳定的工作 科技日新月异 生活便捷高效 这是一个最坏的时代 房价水涨船高 工资涨幅完全跟不上物价的涨幅 8090后年轻人们面临着巨大的生活压力 钱 成为了禁锢他们的牢笼 在这个时代 普通人
  • Mybatis如何处理Result Maps collection already contains value for xxx异常呢?

    转自 Mybatis如何处理Result Maps collection already contains value for xxx异常呢 下文笔者讲述一次mybatis异常的处理分享 如下所示 Mybatis异常摘要 2022 08 1
  • Java初识RabbitMQ一交换机(fanout exchange)

    扇型交换机 funout exchange 将消息路由给绑定到它身上的所有队列 而不理会绑定的路由键 如果 N 个队列绑定到某个扇型交换机上 当有消息发送给此扇型交换机时 交换机会将消息的拷贝分别发送给这所有的 N 个队列 因为扇型交换机投
  • 取消已设置为SVN的文件夹(清理SVN标志)

    取消CheckOut后的文件与svn的联系 Windows Registry Editor Version 5 00 HKEY LOCAL MACHINE SOFTWARE Classes Folder shell DeleteSVN 删除
  • 代码随想录训练营第14天

    参考 代码随想录 一 理论基础 一 二叉树的种类 满二叉树 完全二叉树 二叉搜索树 平衡二叉搜索树 二 二叉树的存储方式 顺序存储 顺序存储的元素在内存中是连续分布的 通常用数组来存储 如果父节点的数组下标是 i 那么它的左孩子就是 i 2
  • ucos学习资料、论坛等

    论坛 http bbs elecfans com forum php mod forumdisplay fid 301 typeid 505 教程推荐 第一步 嵌入式实时操作系统 COS II原理及应用 任哲编著 首选任哲的这本书 我建议先
  • 对IOC和DI的通俗理解

    学习过spring框架的人一定都会听过Spring的IoC 控制反转 DI 依赖注入 这两个概念 对于初学Spring的人来说 总觉得IoC DI这两个概念是模糊不清的 是很难理解的 今天和大家分享网上的一些技术大牛们对Spring框架的I