转载地址:https://zhuanlan.zhihu.com/p/95869440

控制反转
控制反转(Inversion of Control,简称IoC),是面向对象编程中的一种设计思想,其作用是用来降低代码间的耦合度(低[松]耦合)。其实现IoC主要有两种方法,一种是依赖注入(Denpendency Injection),一种是依赖查找(Denpendency Lookup)。IoC通过依赖注入的方法,解决了代码间高耦合度的问题。

如何理解控制反转
在理解控制反转之前,我们不妨先拆分下,把控制反转拆分成“控制”和“反转”。由此,我们可以得出以下三个疑问:
是谁控制谁?
控制的是什么?
反转的是什么?
要搞懂这些为什么,我们需要寻找一个切入点,那么提出控制反转的目的是什么?我们前面说它的目的是降低代码间的耦合度。
那什么又是耦合度呢,在一个真实的项目中,势必会存在多个对象,那对象与对象之间势必存在依赖关系,对象间的这种依赖关系越低,就说明对象间的耦合度越低,那代码的可扩展性就越高。在理解了耦合度之后,事情仿佛变得越来越清晰了,我们先梳理下,控制反转的目的是用来降低代码间的耦合度,代码的耦合度跟对象之间依赖有关系,也就是说我们要把对象间的这种依赖关系控制的越低越好。

在此,我们用例子说明一下,比如说我们现在有两个对象A和B,现在要在A对象中使用B,我们如何去做,是不是要在A对象中new一个B对象啊,也就是说是A对象在控制B对象,那现在我们是不是就明白了,控制指的就是依赖对象的创建。在这个过程中谁是老大,当然是A啦,A主宰着B的创建,所以A说了算。

控制指的就是,当前应用程序(A对象)主宰着所有资源(B对象)的获取,也就是控制着依赖资源的获取过程!

至此,我们已经搞懂两个了,还有一个反转。由前面的分析我们知道,是当前对象控制的依赖对象,那么反转,也就是说不是当前对象在控制依赖对象。那由谁控制呢,这就是接下来我们要解释的依赖注入,在此之前我们先总结下我们之前提出的三个为什么。

谁控制谁:当前应用程序控制依赖资源(对象、数据等);
控制什么:获取依赖资源的过程;
反转什么:获取依赖资源的过程被反转了;

依赖注入(Denpendency Injection,简称DI):
我们之前分析到,控制被反转了,也就是说获取依赖资源的过程被反转了。之前由应用程序主动获取变成了被动接受。同样在理解依赖注入之前,我们按照上面的方式也来拆分下,即:
谁依赖谁?
依赖的是什么?
谁被注入了?
注入的是什么?
刚才我们已经分析到了,应用程序由主动变被动,也就是说应用程序要依赖IoC容器,去帮助它间接的获取依赖对象的资源。然后将依赖对象的资源注入到应用程序中,有了前面的铺垫,我们可以顺理成章的完成上述疑问的答案。
谁依赖谁:应用程序依赖IoC容器;
依赖的是什么:被依赖对象的资源;
谁被注入了:依赖的外部资源;
注入的是什么:应用程序依赖的资源被注入了;

总结:
依赖注入是控制反转实现的一种方式,也就是说控制反转是依赖注入的载体,也就是容器;之前由应用程序来完成对依赖对象的创建,现在全部由IoC容器来完成。它实现的价值就是剥离组件之间的依赖关系,从而实现组件的高内聚性、可扩展性和高可用性。

(转)Ioc控制反转和依赖注入的更多相关文章

  1. Spring专题2: DI,IOC 控制反转和依赖注入

    合集目录 Spring专题2: DI,IOC 控制反转和依赖注入 https://docs.spring.io/spring/docs/2.5.x/reference/aop.html https:/ ...

  2. Java Web实现IOC控制反转之依赖注入

    控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心. 控制反转一般分为两种类型,依赖注入 ...

  3. laravel服务容器(IOC控制反转,DI依赖注入),服务提供者,门脸模式

    laravel的核心思想: 服务容器: 容器:就是装东西的,laravel就是一个个的对象 放入:叫绑定 拿出:解析 使用容器的目的:这里面讲到的是IOC控制反转,主要是靠第三方来处理具体依赖关系的解 ...

  4. Spring的IOC控制反转和依赖注入-重点-spring核心之一

    IoC:Inverse of Control(控制反转): 读作"反转控制",更好理解,不是什么技术,而是一种设计思想,好比于MVC.就是将原本在程序中手动创建对象的控制权,交由S ...

  5. spring IOC --- 控制反转(依赖注入)----简单的实例

    IoC(Inversion of Control)控制反转,对象创建责任的反转,在spring中BeanFacotory是IoC容器的核心接口,负责实例化,定位,配置应用程序中的对象及建立这些对象间的 ...

  6. Spring 04: IOC控制反转 + DI依赖注入

    Spring中的IOC 一种思想,两种实现方式 IOC (Inversion of Control):控制反转,是一种概念和思想,指由Spring容器完成对象创建和依赖注入 核心业务:(a)对象的创建 ...

  7. 搞定.NET MVC IOC控制反转,依赖注入

    一直听说IOC,但是一直没接触过,只看例子好像很高达上的样子,今天抽了点时间实现了下,当然也是借助博客园里面很多前辈的文章来搞的!现在做个笔记,防止自己以后忘记! 1.首先创建MVC项目 2.然后新建 ...

  8. Java之控制反转和依赖注入

    1.简介 依赖注入和控制反转,目的是为了使类与类之间解耦合,提高系统的可扩展性和可维护性,下面通过一个例子来引入这一概念. 2.案例 1)一般情况下的类耦合 Main.java public clas ...

  9. java控制反转与依赖注入

    1.简介 依赖注入和控制反转,目的是为了使类与类之间解耦合,提高系统的可扩展性和可维护性,下面通过一个例子来引入这一概念. 2.案例 1)一般情况下的类耦合 Main.java public clas ...

随机推荐

  1. 如何在Ubuntu上给软件创建快捷方式

    特殊方法:在搜索栏搜索程序  然后在快捷栏 反键 锁定在启动器     默认情况下,Ubuntu会将自动安装的软件快捷方式保存在/usr/share/applications目录下,如果我们要创建桌面 ...

  2. 开发 Laravel 扩展的基本流程

    创建一个空的laravel项目 composer create-project --prefer-dist laravel/laravel pkg 在新建的 laravel 项目中建立如下目录 qia ...

  3. JS内置对象-Array之常用API

  4. JavaScript构造函数学习笔记分享

    构造函数就是一个普通的函数,创建方式和普通函数没有区别 不同的是构造函数名习惯上首字母大写 普通函数是直接调用,而构造函数需要使用new关键字来调用 构造函数的执行流程: 立刻创建一个新的对象 将新建 ...

  5. VS删除代码中没用的空白行

    在vs编辑器中有时需要批量删除无用的空白行,为此,可以使用vs编辑器的查找替换功能: 1. Ctrl+H,打开替换功能框. 2.选择“使用正则表达式”,“当前文档”. 3.在查找框中输入: (?< ...

  6. Supermap/Cesium 开发心得----获取三维视角的四至范围

    网上目前有两种获取当前Camera的四至范围的方法 方法一    这种方法是最通用的,即使在哥伦布视角(2.5D下依旧能准确获取值) function getCurrentExtent() { // ...

  7. UWP 在ShellPage.xaml.cs 中导航至其他页面引发System.Exception

    最近有一个需求,需要App监测网络变化,并在网络变化的同时用户,你切网啦,并且导航至一个切网的特定页面. 和Android.iOS的小伙伴后共同发现,人家有一个类似”拦截器“的框架,可以拦截App发出 ...

  8. aop的应用和简单原理

    实现过程: 1.pom引包 <dependency> <groupId>org.springframework.boot</groupId> <artifac ...

  9. 设计模式(含UML、设计原则、各种模式讲解链接)

    一.统一建模语言UML UML是一种开放的方法,用于说明.可视化.构建和编写一个正在开发的.面向对象的.软件密集系统的制品的开放方法 UML展现了一系列最佳工程实践,这些最佳实践在对大规模,复杂系统进 ...

  10. C#线程学习笔记一:线程基础

    本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/18/Thread.html,记录一下学习过程以备后续查用. 一.线程的介绍 进程(Proce ...