(转)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 ...
随机推荐
- 如何在Ubuntu上给软件创建快捷方式
特殊方法:在搜索栏搜索程序 然后在快捷栏 反键 锁定在启动器 默认情况下,Ubuntu会将自动安装的软件快捷方式保存在/usr/share/applications目录下,如果我们要创建桌面 ...
- 开发 Laravel 扩展的基本流程
创建一个空的laravel项目 composer create-project --prefer-dist laravel/laravel pkg 在新建的 laravel 项目中建立如下目录 qia ...
- JS内置对象-Array之常用API
- JavaScript构造函数学习笔记分享
构造函数就是一个普通的函数,创建方式和普通函数没有区别 不同的是构造函数名习惯上首字母大写 普通函数是直接调用,而构造函数需要使用new关键字来调用 构造函数的执行流程: 立刻创建一个新的对象 将新建 ...
- VS删除代码中没用的空白行
在vs编辑器中有时需要批量删除无用的空白行,为此,可以使用vs编辑器的查找替换功能: 1. Ctrl+H,打开替换功能框. 2.选择“使用正则表达式”,“当前文档”. 3.在查找框中输入: (?< ...
- Supermap/Cesium 开发心得----获取三维视角的四至范围
网上目前有两种获取当前Camera的四至范围的方法 方法一 这种方法是最通用的,即使在哥伦布视角(2.5D下依旧能准确获取值) function getCurrentExtent() { // ...
- UWP 在ShellPage.xaml.cs 中导航至其他页面引发System.Exception
最近有一个需求,需要App监测网络变化,并在网络变化的同时用户,你切网啦,并且导航至一个切网的特定页面. 和Android.iOS的小伙伴后共同发现,人家有一个类似”拦截器“的框架,可以拦截App发出 ...
- aop的应用和简单原理
实现过程: 1.pom引包 <dependency> <groupId>org.springframework.boot</groupId> <artifac ...
- 设计模式(含UML、设计原则、各种模式讲解链接)
一.统一建模语言UML UML是一种开放的方法,用于说明.可视化.构建和编写一个正在开发的.面向对象的.软件密集系统的制品的开放方法 UML展现了一系列最佳工程实践,这些最佳实践在对大规模,复杂系统进 ...
- C#线程学习笔记一:线程基础
本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/18/Thread.html,记录一下学习过程以备后续查用. 一.线程的介绍 进程(Proce ...