依赖注入和控制反转

概念

 IoC——Inversion of Control  控制反转
 DI——Dependency Injection   依赖注入

要想理解上面两个概念,就必须搞清楚如下的问题:

  • 参与者都有谁?

  • 依赖:谁依赖于谁?为什么需要依赖?

  • 注入:谁注入于谁?到底注入什么?

  • 控制反转:谁控制谁?控制什么?为何叫反转(有反转就应该有正转了)?

  • 依赖注入和控制反转是同一概念吗?

下面就来简要的回答一下上述问题,把这些问题搞明白了,IoC/DI也就明白了。

  1. 参与者都有谁:一般有三方参与者,一个是某个对象;一个是IoC/DI的容器;另一个是某个对象的外部资源。又要名词解释一下,某个对象指的就是任意的、普通的Java对象; IoC/DI的容器简单点说就是指用来实现IoC/DI功能的一个框架程序;对象的外部资源指的就是对象需要的,但是是从对象外部获取的,都统称资源,比如:对象需要的其它对象、或者是对象需要的文件资源等等。

  2. 谁依赖于谁:当然是某个对象依赖于IoC/DI的容器

  3. 为什么需要依赖:对象需要IoC/DI的容器来提供对象需要的外部资源

  4. 谁注入于谁:很明显是IoC/DI的容器 注入 某个对象

  5. 到底注入什么:就是注入某个对象所需要的外部资源

  6. 谁控制谁:当然是IoC/DI的容器来控制对象了

  7. 控制什么:主要是控制对象实例的创建

  8. 为何叫反转:反转是相对于正向而言的,那么什么算是正向的呢?考虑一下常规情况下的应用程序,如果要在A里面使用C,你会怎么做呢?当然是直接去创建C的对象,也就是说,是在A类中主动去获取所需要的外部资源C,这种情况被称为正向的。那么什么是反向呢?就是A类不再主动去获取C,而是被动等待,等待IoC/DI的容器获取一个C的实例,然后反向的注入到A类中。

 

用图例来说明一下,先看没有IoC/DI的时候,常规的A类使用C类的示意图,如图所示:

 

 

当有了IoC/DI的容器后,A类不再主动去创建C了,如图所示:

           A类不再主动创建C

 

而是被动等待,等待IoC/DI的容器获取一个C的实例,然后反向的注入到A类中,

            有IoC/DI容器后程序结构示意图

 

依赖注入和控制反转是同一概念吗?

    根据上面的讲述,应该能看出来,依赖注入和控制反转是对同一件事情的不同描述,从某个方面讲,就是它们描述的角度不同。依赖注入是从应用程序的角度在描述,可以把依赖注入描述完整点:应用程序依赖容器创建并注入它所需要的外部资源;而控制反转是从容器的角度在描述,描述完整点:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。

总结

实IoC/DI对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC/DI容器来创建并注入它所需要的资源了。
        这么小小的一个改变其实是编程思想的一个大进步,这样就有效的分离了对象和它所需要的外部资源,使得它们松散耦合,有利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

原文地址:http://www.cnblogs.com/liying0721/p/6824742.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322911.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop生态Flume(一)介绍

一、概述 Apache Flume是一个分布式,可靠且可用的系统,用于有效地收集,聚合大量日志数据并将其从许多不同的源移动到集中式数据存储中。 Apache Flume的使用不仅限于日志数据聚合。由于数据源是可定制的,因此Flume可用于传输大量…

centos7安装最新版node

为了在linux服务端运行前端以及node后端项目,就必须在服务器上安装node了 但是想要运行前端项目版本就必须是8.x以上的,所以我们干脆安装最新的node 下载 进入下面的官方网站 https://nodejs.org/en/download/ 点击64位的Linux下载 复制该网址 这里以…

P3388-[模板]割点(割顶)【tarjan】

正题 题目大意 求所有割点 解题思路 跑tarjantarjantarjan&#xff0c;然后判断dfnx≤lowydfn_x\leq low_ydfnx​≤lowy​ codecodecode #include<cstdio> #include<algorithm> #define N 20100 #define M 100100 using namespace std; struct node{int to,next…

[译]ASP.NET Core 2.0 网址重定向

问题 如何在ASP.NET Core 2.0中实现网址重定向&#xff1f; 答案 新建一个空项目&#xff0c;在Startup.cs文件中&#xff0c;配置RewriteOptions参数并添加网址重定向中间件&#xff08;UseRewriter&#xff09;&#xff1a; public void Configure(IApplicationBuilder app, …

Hadoop生态Flume(二)安装配置

一、flume下载地址 列中的链接应显示可用镜像的列表&#xff0c;并根据您的推断位置进行默认选择。如果看不到该页面&#xff0c;请尝试使用其他浏览器。校验和和签名是主分发服务器上原始文件的链接。 Apache Flume二进制文件&#xff08;tar.gz&#xff09;apache-flume-1.…

小程序如何将wx.request里的数据传出去

设置一个事件&#xff0c;用来测试 用类似于vue中的this.msg result.data[1].receiver并不能把值传出去 但是用setData却可以&#xff0c;代码如下 btnclick:function(){var that this;wx.request({url: http://www.k1998.xyz/kjh/reciever.php,success: (result) > {cons…

纪中2019(上)游记+总结

目录之下 文章目录目录之下游记之下Day−1Day-1Day−1Day0Day0Day0Day1Day1Day1Day2Day2Day2Day3Day3Day3Day4Day4Day4Day5Day5Day5Day6Day6Day6Day7Day7Day7Day8Day8Day8Day9Day9Day9Day10Day10Day10Day11Day11Day11Day12Day12Day12Day13Day13Day13Day14Day14Day14比赛之下欢乐…

asp.net core WebAPI实现CRUD

本节用于构建一个简单的WebAPI来管理to-do列表。不会创建用户界面。 API Description Request body Response body GET /api/todo Get all to-do items NoneArray of to-do items GET /api/todo/{id} Get an item by ID NoneTo-do item POST /api/todo Add a new item To-do it…

Hadoop2.6.0的Intellij Idea 插件

一、Hadoop2.6.0的Idea Intellij插件下载 github源码地址 github插件压缩包 二、安装插件 setting》Plugins》install plugins from disk 选择压缩包&#xff0c;重启Idea就行 安装完的结果&#xff1a;

v-for指令案例详解

对于v-for指令&#xff0c;以前老是不能理解&#xff0c;经常记混&#xff0c;所以特地写篇笔记来加强下记忆&#xff0c;希望借此能学的更深刻一点 v-for顾名思义就是个for循环&#xff0c;是vue的一个循环。在遍历json字符串的时候有奇佳的效果&#xff0c;感觉就是为他们而造…

jzoj1273-袁绍的刁难【进制转换】

正题 题目大意 第iii个武将价值为3i−13^{i-1}3i−1&#xff0c;求第kkk大的选择武将价值之和 解题思路 因为∑i0n−13i<3n\sum_{i0}^{n-1}3^i<3^{n}∑i0n−1​3i<3n 所以其实答案就是kkk转成二进制之后强行转成3进制的值。 codecodecode #include<cstdio> …

Docker ASP.NET Core 2.0 微服务跨平台实践

本篇博文的目的&#xff1a;在 Mac OS 中使用 VS Code 开发 ASP.NET Core 2.0 应用程序&#xff0c;然后在 Ubuntu 服务器配置 Docker 环境&#xff0c;并使用 Docker 运行 Consul 和 Fabio 环境&#xff0c;最后使用 Docker 运行 ASP.NET Core 2.0 应用程序。 你要的项目源码&…

Vue之splice和push

methods:{getIt(){this.list.push({name:"aaa"}) },delIt(){this.list.splice(0,1)}}对于splice() 前面的是序列号&#xff0c;后面的是删除的个数 序列号为1的时候&#xff0c;从后面删 序列号为0的时候&#xff0c;从前面开始删 序列号为2或者2以上的时候&#xff…

微软Connect(); 2017大会梳理:Azure、数据、AI开发工具

在今天召开的 Connect(); 2017 开发者大会上&#xff0c;微软宣布了 Azure、数据、AI 开发工具的内容。这是第一天的 Connect(); 2017 的主题演讲。 在开场视频中霍金又来了。你记得这个Intel为他开发的系统使用了C#&#xff0c;而且是开源的&#xff0c;在Github上地址&#x…

jzoj5230-队伍统计【状压dp】

正题 题目大意 nnn个人排队&#xff0c;mmm个条件(u,v)(u,v)(u,v)表示uuu要排在vvv前&#xff0c;可以去掉kkk个&#xff0c;求方案总数 解题思路 考虑依次插入人在队头 对于状态1表示已经在队列里&#xff0c;0表示不在 fi,jf_{i,j}fi,j​表示iii表示状态,jjj表示违背了的条件…

Hadoop生态hive(五)Hive QL数据库

&#xff08;1&#xff09;查看数据库 show databases; &#xff08;2&#xff09;使用数据库 use db; &#xff08;3&#xff09;查看当前数据库 #与mysql的select database();不一样 select current_database(); &#xff08;4&#xff09;创建数据库 create database [if …

TypeError: Cannot set property 'msg' of undefined

在axios中想把数据取出来 this. msg “kkk” 但是却报TypeError: Cannot set property ‘msg’ of undefined的错误 后来找到&#xff0c;原来是自己没有函数不是箭头函数导致的 如果不是箭头函数的话&#xff0c;this的指向就会有问题&#xff0c;然后一直报错 将一下代码改为…

jzoj5231-序列问题【分治】

正题 题目大意 nnn个数字&#xff0c;求 (∑l1n∑rlnmin{ai}∗max{ai}(i∈[l..r]))%(1097)(\sum_{l1}^n\sum_{rl}^nmin\{a_i\}*max\{a_i\}(i\in [l..r]))\%(10^97)(l1∑n​rl∑n​min{ai​}∗max{ai​}(i∈[l..r]))%(1097) 解题思路 考虑分治&#xff0c;单独在半个内的分治下…

讨论.NET Core 配置对GC 工作模式与内存的影响

引出问题: Asp.net core应用在 Kubernetes上内存使用率过高问题分析 Asp.net core应用在 Kubernetes上内存使用率过高问题分析 这篇文章中讨论了&#xff0c;在默认情况下&#xff0c;ASP.NET Core程序跑在K8s的Docker中内存使用率>600MB&#xff0c;导致Docker容器频繁重启…

Hadoop生态hive(六)Hive QL表

一、创建表 语法&#xff1a; create [temporary] [external] table [if not exists] [db_name.] table_name [(col_name data_type [comment col_comment], ...)] [comment table_comment] [row format row_format] [stored as file_format] 例子&#xff1a; create tab…