转载地址: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. VARIANT、 _variant_t、CComVariant、COleVariant、CDBVariant

    参考文章 http://blog.163.com/wslngcjsdxdr@126/blog/static/16219623020107634935586/ http://blog.csdn.net/ ...

  2. 如何关注flink的maillist,参与贡献

    对一些开源的中间件 大家可能都很热爱,如何参与其中呢,很多人却感觉是一件很遥远的事情, 最近一时兴起,迈出这一步,我关注一下也没啥问题 以下对flink的关注的一些步骤,(详细的可以参考官网步骤,ht ...

  3. JS数据结构——队列

    创建一个自己的类来表示一个队列 function Queue() { //这里写属性和方法 } 首先需要一个用于存储队列中元素的数据结构,可以用数组 let items = [] 接下来声明一些队列可 ...

  4. python学习-logging

    """#设置输出的日志内容格式fmt = '%(asctime)s %(filename)s %(funcName)s [line:%(lineno)d] %(level ...

  5. 格式化字符串漏洞 format string exploit(一)

    本文系原创,转载请说明出处 本文为基于CTF WIKI的PWN学习 0x00 格式化字符串原理 先附一张经典的图,如下 其栈上布局如下: some value 3.14 123456 addr of ...

  6. 解读setTimeout, promise.then, process.nextTick, setImmediate的执行顺序

    最近在看<Node.js调试指南>的时候遇到有意思的几道题,是关于setTimeout, promise.then, process.nextTick, setImmediate的执行顺序 ...

  7. 在CentOS 7 上使用Docker 运行.NetCore项目

    安装Docker CentOS 7 安装 Docker 编写Dockerfile 右键项目->添加->Docker 支持 选择Linux 修改为如下: FROM mcr.microsoft ...

  8. ElasticSearch 7.4.2 Root mapping definition has unsupported parameters

    新建索引 PUT people { "settings":{ "number_of_shards":3, "number_of_replicas&qu ...

  9. day04逻辑运算符短路、多分支结构(if和switch)、循环结构、while循环

    复习 1.运算符和表达式 1)表达式 2)算数运算符 + - * / % 3)关系运算符 >  <  >=  <=  ==  != 4)逻辑运算符 &&   | ...

  10. java.sql.SQLException: Unknown initial character set index '255' received from server. Initial client character set can be forced via the 'characterEncoding' property.解决方案

    解决方案: 首先查看数据库的版本号,删除旧的jar包,将mysql-connector-java.jar更换成对应版本号 同时在连接数据库的url后加上?useUnicode=true&cha ...