深入理解 IoC、DI
本文转载自博客:https://www.cnblogs.com/xinhuaxuan/p/6132372.html

1、控制反转:谁控制谁?控制什么?为何叫反转(对应于正向)?哪些方面反转了?为何需要反转?
- 谁控制谁?
IoC/DI 容器控制应用程序。
- 控制什么?
IoC/DI 容器控制对象本身的创建、实例化;IoC/DI 容器控制对象之间的依赖关系。
- 为何叫反转(对应于正向)?
因为现在应用程序不能主动去获取外部资源了,而是被动等待 IoC/DI 容器给它注入它所需要的资源,所以称之为反转。
- 哪些方面反转了?
创建对象的方式;程序获取资源的方式。
- 为何需要反转?
引入 IoC/DI 容器过后,体系更为松散,而且管理更有序;类之间真正实现了松散耦合。
2、依赖:什么是依赖(按名称理解、按动词理解)?谁依赖于谁?为什么需要依赖?依赖什么东西?
- 什么是依赖(按名称理解、按动词理解)?
按名称理解:依赖关系;按动词理解:依赖的动作。
- 谁依赖于谁?
应用程序依赖于 IoC/DI 容器。
- 为什么需要依赖?
因为发生了反转,应用程序依赖的资源都是 IoC/DI 容器里面。
- 依赖什么东西?
应用程序依赖于 IoC/DI 容器,依赖 IoC/DI 容器为它注入所需要的资源(如:依赖关系)。
3、注入:谁注入于谁?注入什么东西?为何要注入?
- 谁注入于谁?
IoC/DI 容器注入于应用程序。
- 注入什么东西?
注入应用程序需要的外部资源(如:依赖关系)。
- 为何要注入?
因为程序要正常运行需要这些外部资源。
4、依赖注入和控制反转是同一概念吗?
- 不是同一概念,但实际上它们描述的是同一件事情,只不过是从不同角度来说的:控制反转是从 IoC/DI 容器的角度;依赖注入是从应用程序的角度。
- 控制反转的描述:IoC/DI 容器反过来控制应用程序,控制应用程序锁所需要的外部资源(如:外部资源)。
- 依赖注入的描述:应用程序依赖 IoC/DI 容器,依赖它注入所需要的外部资源。
5、参与者都有哪些?
- IoC/DI 容器、应用程序。
6、IoC/DI 是什么?能做什么?怎么做?用在什么地方?
- IoC/DI 是什么?
IoC:就是使用 IoC/DI 容器反过来控制应用程序所需要的外部资源,这样的一种程序开发思想。
DI:就是应用程序依赖 IoC/DI 容器来注入所需要的外部资源,这样一种程序的开发思想。
- 能做什么?
松散耦合对象。
- 怎么做?
可以选择使用 Spring 框架,里面有大量已经实现了的 IoC/DI 容器。
- 用在什么地方?
凡是程序里面需要使用外部资源的情况,都可以考虑使用 IoC/DI 容器。
7、什么是外部资源?
- 对于一个类来讲,外部资源就是指在本类内部不能得到或实现的东西,比如:在类里面需要读取一个配置文件,那么这个配置文件就相当于这个类的外部资源。又比如:A 类里面要调用 B 类,那么对于 A 类来讲 B 类就是其外部资源。
8、什么是 IoC 容器?
- 简单理解就是:实现 IoC 思想,并提供对象创建、对象装配以及对象生命周期管理的软件就是 IoC 容器。
- 对 IoC 的理解:
a、应用程序无需主动 new 对象,而是描述对象应该如何被创建。
b、应用程序不需要主动装配对象之间的依赖关系,而是描述需要哪个服务,IoC 容器会帮你装配,你只需被动接受装配。
c、主动变被动,是一种让服务消费者不直接依赖于服务提供者的组件设计方式,是一种减少类与类之间依赖的设计原则。
9、使用 IoC/DI 容器开发需要改变思路
- 应用程序不主动创建对象,但要描述创建它们的方式。
- 在应用程序代码中不直接进行服务的装配,但是要描述哪一个组件需要哪一项服务,由容器负责将它们装配在一起。也就是说:所有的组件都是被动的,组件初始化和专供都由容器负责,应用程序只是在获取相应组件后实现功能即可。
深入理解 IoC、DI的更多相关文章
- 深入理解IoC/DI
------------------------------------------------------------------------ 理解IoC/DI 1.控制反转 --> 谁控制谁 ...
- 如何理解IoC/DI
IoC:Inversion of Control,控制反转DI:Dependency Injection,依赖注入 要理解上面两个概念,就必须搞清楚如下的问题: 参与者都有谁?依赖:谁依赖于谁?为什么 ...
- PHP程序员如何理解IoC/DI(转)
php - Dependency Injection依赖注入 和 自动加载 各自的优缺点 ioc/di和自动加载时两回事. ioc/di 让代码由创建对象改为注入对象,是一种编程思想,而自动加载,只是 ...
- Spring理解IOC,DI,AOP作用,概念,理解。
IOC控制反转:创建实例对象的控制权从代码转换到Spring容器.实际就是在xml中配置.配置对象 实例化对象时,进行强转为自定义类型.默认返回类型是Object强类型. ApplicationCon ...
- PHP程序员如何理解IoC/DI
思想是解决问题的根本 思想必须转换成习惯构建一套完整的思想体系是开发能力成熟的标志 详情请点击
- 深入理解IoC和DI
本文章转载自: https://segmentfault.com/a/1190000005602011 最近在研究php的lumen框架和phalcon框架,这两个框架的底层架构都用到了IoC,DI, ...
- Spring.Net---3、IoC/DI深入理解
------------------------------------------------------------------------ 理解IoC/DI 1.控制反转 --> 谁控制谁 ...
- 6. Laravel5学习笔记:IOC/DI的理解
介绍 IOC 控制反转 Inversion of Control 依赖关系的转移 依赖抽象而非实践 DI 依赖注入 Dependency Injection 不必自己在代码中维护对象的依赖 容器自己主 ...
- 工厂方法模式与IoC/DI
IoC——Inversion of Control 控制反转 DI——Dependency Injection 依赖注入 1:如何理解IoC/DI 要想理解上面两个概念,就必须搞清 ...
- 设计模式之初识IoC/DI(六)
本篇和大家一起学习IoC和DI即控制反转和依赖注入. 当然听上去这词语非常的专业,真不知道是怎么组出来的,看上去难归看上去难,但稍微理解一下也就这么回事了. 首先我们要明白IoC/DI干嘛用的,不然别 ...
随机推荐
- 微信小程序--家庭记账小账本(三)
家庭记账小账本打算先通过微信小程序来实现,昨天就去注册了解了一下微信小程序,感觉比较复杂而且困难.如何将ecplise源代码与小程序连接,如何建立数据库等等都困扰了我.查阅网上的资料也没有很大的进展. ...
- 入门python有什么好的书籍推荐?纯干货推荐,你值得一看 python基础,爬虫,数据分析
Python入门书籍不用看太多,看一本就够.重要的是你要学习Python的哪个方向,或者说你对什么方向感兴趣,因为Python这门语言的应用领域比较广泛,比如说可以用来做数据分析.机器学习,也可以用来 ...
- Ternary weight networks
Introduction 这两天看了一下这篇文章,我就这里分享一下,不过我还是只记录一下跟别人blog上没有,或者自己的想法(ps: 因为有时候翻blog时候发现每篇都一样还是挺烦的= =) .为了不 ...
- GitLab 后台修改用户密码
GitLab 后台修改用户密码 # 打开控制台 gitlab-rails console production # 找到用户,输入密码,确认密码,保存 user = User.find_by(user ...
- MyBatisPlus乐观锁,乐观锁竟然如此简单
乐观锁 在便是过程中,我们经常会被问到乐观锁,悲观锁,都非常简单 乐观锁:顾名思义,思想十分乐观,总是认为不会出现问题,无论什么都不去上锁!如果出现了问题,就再更新测试 悲观锁:顾明思义,思想十分悲观 ...
- 使用 .NET Core 3.x 构建 RESTFUL Api
准备工作:在此之前你需要了解关于.NET .Core的基础,前面几篇文章已经介绍:https://www.cnblogs.com/hcyesdo/p/12834345.html 首先需要明确一点的就是 ...
- 解Bug之路-dubbo流量上线时的非平滑问题
前言 笔者最近解决了一个困扰了业务系统很久的问题.这个问题只在发布时出现,每次只影响一两次调用,相较于其它的问题来说,这个问题有点不够受重视.由于种种原因,使得这个问题到了业务必须解决的程度,于是就到 ...
- HBA卡常用命令
HBA卡信息查看 查看对应的PCI设备lspci | grep LSI 如下:对应的HBA卡命令为sas3ircu 如下:对应的HBA卡使用sas2ircu 查看LSI控制器类型和型号 sas2irc ...
- 解决 Could not resolve type alias 'com.deppon.gis.module.job.server.util.SdoGeometryTypeHandler'. 的办法
单元测试提示下面错误: 核心错误: Failed to parse mapping resource: 'file [D:\490993\安装程序\DPAP2.1\dpap_v2.0.1\dpap_v ...
- JS 时间获取 (常用)
/** * 获取几天之前日期 */ daysAgo(dayNum = 0) { let myDate = new Date() let lw = new Date(myDate - 1000 * 60 ...