(转)Ioc控制反转和依赖注入
转载地址: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控制反转和依赖注入的更多相关文章
- Spring专题2: DI,IOC 控制反转和依赖注入
合集目录 Spring专题2: DI,IOC 控制反转和依赖注入 https://docs.spring.io/spring/docs/2.5.x/reference/aop.html https:/ ...
- Java Web实现IOC控制反转之依赖注入
控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心. 控制反转一般分为两种类型,依赖注入 ...
- laravel服务容器(IOC控制反转,DI依赖注入),服务提供者,门脸模式
laravel的核心思想: 服务容器: 容器:就是装东西的,laravel就是一个个的对象 放入:叫绑定 拿出:解析 使用容器的目的:这里面讲到的是IOC控制反转,主要是靠第三方来处理具体依赖关系的解 ...
- Spring的IOC控制反转和依赖注入-重点-spring核心之一
IoC:Inverse of Control(控制反转): 读作"反转控制",更好理解,不是什么技术,而是一种设计思想,好比于MVC.就是将原本在程序中手动创建对象的控制权,交由S ...
- spring IOC --- 控制反转(依赖注入)----简单的实例
IoC(Inversion of Control)控制反转,对象创建责任的反转,在spring中BeanFacotory是IoC容器的核心接口,负责实例化,定位,配置应用程序中的对象及建立这些对象间的 ...
- Spring 04: IOC控制反转 + DI依赖注入
Spring中的IOC 一种思想,两种实现方式 IOC (Inversion of Control):控制反转,是一种概念和思想,指由Spring容器完成对象创建和依赖注入 核心业务:(a)对象的创建 ...
- 搞定.NET MVC IOC控制反转,依赖注入
一直听说IOC,但是一直没接触过,只看例子好像很高达上的样子,今天抽了点时间实现了下,当然也是借助博客园里面很多前辈的文章来搞的!现在做个笔记,防止自己以后忘记! 1.首先创建MVC项目 2.然后新建 ...
- Java之控制反转和依赖注入
1.简介 依赖注入和控制反转,目的是为了使类与类之间解耦合,提高系统的可扩展性和可维护性,下面通过一个例子来引入这一概念. 2.案例 1)一般情况下的类耦合 Main.java public clas ...
- java控制反转与依赖注入
1.简介 依赖注入和控制反转,目的是为了使类与类之间解耦合,提高系统的可扩展性和可维护性,下面通过一个例子来引入这一概念. 2.案例 1)一般情况下的类耦合 Main.java public clas ...
随机推荐
- ARTS-S anaconda常用命令
建新的环境 conda create --name py36 python=3.6 显示所有环境 conda info --envs 一键安装 wget https://repo.anaconda.c ...
- Tesseract-OCR 字体库下载地址
https://github.com/tesseract-ocr/tesseract/wiki/Data-Files
- 【重温基础】15.JS对象介绍
从这篇文章开始,复习 MDN 中级教程 的内容了,在初级教程中,我和大家分享了一些比较简单基础的知识点,并放在我的 [Cute-JavaScript]系列文章中. 关于[Cute-JavaScript ...
- 【Java Web开发学习】Spring4条件化的bean
[Java Web开发学习]Spring4条件化的bean 转载:https://www.cnblogs.com/yangchongxing/p/9071960.html Spring4引入了@Con ...
- 9月最新184道阿里、百度、腾讯、头条Java面试题合集
阿里面试题 1. 如何实现一个高效的单向链表逆序输出? 2. 已知sqrt(2)约等于1.414,要求不用数学库,求sqrt(2)精确到小数点后10位 3. 给定一个二叉搜索树(BST),找到树中第 ...
- Enumeration接口和Iterator接口的区别有哪些?
Enumeration速度是Iterator的2倍,同时占用更少的内存.但是,Iterator远远比Enumeration安全,因为其他线程不能够修改正在被iterator遍历的集合里面的对象.同时, ...
- Python之如何修改运行的快捷键
如果你在Pycharm中运行程序使用Ctrl+shift+F10快捷键,运行失败,使用Pycharm工具组,右键一下选择“Run+文件名称AAA”运行程序,直接运行成功的话,那么你就可以 更换自己的运 ...
- 由malloc和new引发的段错误
class Queue{ private: struct node{ string data; struct node * next,*priv; } private: struct node * p ...
- 超级详细Mysql安装步骤图解
数据库忘记装了,然后今天才装上.刚开始有点蒙蔽,进入mysql官网一堆英文,小声逼逼没有学号英语的我.废话不都说,直接上图 1.输入网址 https://www.mysql.com/downloads ...
- MYSQL 游标学习及使用实例
who?(游标是什么?)游标(cursor)官方定义:是系统为用户开通的一个数据缓冲区,存放sql执行结果.每个游标区都有一个名字,用户可以通过sql语句逐一从游标中获取记录,并赋值给变量,交由主语言 ...