简单解释什么是 依赖注入 和 控制反转

简单解释什么是 依赖注入 和 控制反转
2017-07-09

关于 依赖注入 与 控制反转 的概念有些人觉得很难理解,最近在给别人讲这个概念的时候梳理了一个比较好理解的解释,而且我认为非技术人员也应该能听的懂,因此分享给大家,希望下次你在给别人讲的时候也能讲的明白。

其实 依赖注入 和 控制反转 说的是同一件事情,只是站的角度不同而已。

我们就拿超人和小怪兽的事情来做类比对象。

地球受到了威胁,不断有小怪兽来想要破坏地球,每来一个小怪兽我们就需要找一个超人去对付他,一个超人肯定是不够的,因为每次来到小怪兽都是不一样的,他们所具有的能力也是不一样的。

因此我们必须找到合适的超人去对付他,最坏的情况是每来一个小怪兽我们就要找一个或者制造一个新超人,那么来十个小怪兽,我们就要制造十个,来百个就要制造百个,来千,来万,来亿我们就要制造相应的超人,而大部分超人只能用一次。

为了解决这个问题我们引入依赖注入和控制反转的概念,我们将超人和超能力分开,独立的超人和独立的超能力,当一个小怪兽来的时候我们找到超人,将相应的超能力给予他,让他去消灭小怪兽。

这样的话我们只需要几个超人就好了,我们不再需要制造超人,而是研究如何制造更多更好的超能力给超人使用。

超能力和超人不再是强依赖关系。超能力是由外部给予超人的,超人和超能力有依赖,但是这个依赖是外部给予,因此我们可以说超能力是由外部注入给他的,所以这就叫 依赖注入。

而反过来说,超人具有何种超能力不是他内部自身控制的,而是由外部控制的,相当于将超能力具有何种功效交给了外部,外部来决定超人该有的超能力,所以超能力的控制权被由自身控制反转为外部控制,这被称为 控制反转。

这就是关于 依赖注入 和 控制反转 的我的比较好理解的解释。它能较好的解决对象与对象之间的强耦合问题,同时也能做的按需使用按需加载。

顺便说一下,钢铁侠和蝙蝠侠更受欢迎的原因我认为就是因为他们的超能力是外部给予的,而非自身的,因此可以不断有新的超能力给他们使用,因此也更有看点和新鲜感。

原文转载自简单解释什么是 依赖注入 和 控制反转

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

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

相关文章

python pip install指定国内源镜像

有时候安装一些依赖包,网不好,直接超时,或者这个包就是死都下不下来的时候,可以指定国内源镜像。 pip install -i 国内镜像地址 包名 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirr…

机器学习之单标签多分类及多标签多分类

单标签二分类算法 Logistic算法 单标签多分类算法 Softmax算法 One-Versus-One(ovo):一对一 One-Versus-All / One-Versus-the-Rest(ova/ovr): 一对多 ovo和ovr的区别 Error Correcting Output code…

ionic3 隐藏子页面tabs

看了几天ionic3 问题还挺多的,今天想把所有子页面tabs 给去掉,整了半天,发现app.Module 是可以配置的 修改 IonicModule.forRoot(MyApp) imports: [BrowserModule,// IonicModule.forRoot(MyApp),HttpModule,IonicModule.forRoot(…

cas单点登录-jdbc认证(三)

前言 本节的内容为JDBC认证,查找数据库进行验证,其中包括: 密码加密策略(无密码,简单加密,加盐处理)认证策略(jdbc)一、业务需求 不同的公司,需求业务需求或者…

get clone 出现 fatal: the remote end hung up unexpectedly5 MiB | 892.00 KiB/s 报错信息

fatal: the remote end hung up unexpectedly5 MiB | 892.00 KiB/s 解决方案 (亲测有效) 解决方案如下: git clone时加上 --depth1,比如: git clone https://gitee.com/songyitian/tctm.git --depth 1depth用于指定…

mybatis foreach map_重学Mybatis(六)-------输入映射(含面试题)

博主将会针对Java面试题写一组文章,包括J2ee,SQL,主流Web框架,中间件等面试过程中面试官经常问的问题,欢迎大家关注。一起学习,一起成长,文章底部有面试题。入参映射关键字说明图中paramenterTy…

php输出多余的空格或者空行

1&#xff0c;文件是否有bom。可以通过脚步检测&#xff0c;或者利用notepa打开&#xff0c;查看编码格式。 2. <?php echo something; ?> 或许是你的php标签外&#xff0c;有空格或者空行。一般的项目都是用框架&#xff0c;包含很多的文件&#xff0c;如果一个个文…

执行git命令时出现fatal: ‘origin‘ does not appear to be a git repository错误

执行git命令时出现fatal: ‘origin’ does not appear to be a git repository错误 在执行git pull origin master时出现&#xff1a;   fatal: ‘origin’ does not appear to be a git repository   致命提示:“origin”看起来不是一个git存储库   fatal: Could not r…

蒋涛作序盛赞Leo新作为“程序员职场实用百科全书”——《程序员羊皮卷》连载(1)

《程序员羊皮卷》当当购买地址&#xff1a;http://product.dangdang.com/product.aspx?product_id20691986 互动购买地址&#xff1a;http://www.china-pub.com/196049 程序员行业从外面看起来有很多绚丽的光环&#xff0c;这里有无数以程序致富的天才&#xff0c;世界首富比…

matlab ones函数_Matlab中相见恨晚的命令(持续更新)

知乎上有个“有哪些让人相见恨晚的Matlab命令”的话题&#xff0c;很多答主提供的命令确实很实用&#xff0c;为了更方便大家的学习&#xff0c;我就知乎上的答案和我自己想到的都综合整理成了一篇文章&#xff0c;把我觉得很实用的指令整理出来。知乎原答案链接dbstop if erro…

机器学习之特征工程

特征工程-概念 特征工程是一个面向十分广的概念&#xff0c;只要是在处理数据就可以认为是在做特征工程。个人理解&#xff0c;真正意义上的特征工程还是数据降维和数据升维的过程。 而前期对数据的处理过程&#xff1a; 需要哪些数据&#xff1f;数据如何存储&#xff1f;数…

ArcGIS AO开发高亮显示某些要素

参考代码1 ifeaturecursor pcur ifeatureclass.search(iqueryfilter pfilter); pfilter.whereclause strAddress; //输入查询条件&#xff0c;也就是你寸地址的字段名didian ifeature pfeat pcur.nextfeature();// 如果pCur多个要素&#xff0c;则可以考虑将其合并并一起高亮…

Oracle传输表空间介绍

传输表空间通过拷贝数据文件的方式&#xff0c;实现可跨平台的数据迁移&#xff0c;效率远超expdp/impdp, exp/imp等工具。还可以应用跨平台&数据库版本迁移表数据、归档历史数据和实现表空间级时间点数据恢复等场景。转载于:https://www.cnblogs.com/ilifeilong/p/7712654…

git push到GitHub的时候遇到! [rejected] master -> master (non-fast-forward)的问题

git push到GitHub的时候遇到! [rejected] master -> master (non-fast-forward)的问题 解决方法&#xff1a; 1、git pull origin master --allow-unrelated-histories //把远程仓库和本地同步&#xff0c;消除差异 2、重新add和commit相应文件 3、git push origin maste…

程序员考核的五大死因(上)

程序员作为企业开发力量的最核心资产&#xff0c;无疑得到公司从上至下的一致关注。开发是个智力密集型产业&#xff0c;程序开发的特点是&#xff0c;付出相同时间的情况下&#xff0c;两个开发者之间的产能会相差十几甚至几十倍。软件开发人员向来以“不容易考核、工作不容易…

du -sh 如何找到最大的文件夹_小白必看!手把手教你如何在linux上安装redis数据库...

首先我们要清楚redis是什么&#xff1f;redis是一种非关系型数据库&#xff0c;它与MySQL的这种关系型数据库不同&#xff0c;MySQL是将数据存储在磁盘中&#xff0c;而redis是储存在内存中。一般很多公司都是使用MySQLredis两种数据存储方式&#xff0c;这样可以提高性能&…

Linux删除特殊字符文件

1.删除带“-”的文件名的方法使用-- &#xff08;2个横杠&#xff09;#touch -- -%F-%T#rm -- -%F-%Trm: remove regular empty file -%F-%T?使用绝对路径并TAB特殊文件名#rm /root/-%F-%Trm: remove regular empty file /root/-%F-%T?2. 删除包含其它特殊字符的文件对于含有…

机器学习之线性回归 损失函数、代价函数、目标函数

损失函数&#xff08;Loss Function&#xff09;定义在单个样本上&#xff0c;算的是一个样本的误差。比如&#xff1a; 其中0-1损失函数: 感知器损失函数&#xff1a; 平方和损失函数&#xff1a; 绝对损失函数&#xff1a; 对数损失函数&#xff1a; 代价函数&#xff08;Cos…

bzoj4950(二分图最大匹配)

[Wf2017]Mission Improbable Time Limit: 1 Sec Memory Limit: 1024 MBSubmit: 105 Solved: 49[Submit][Status][Discuss]Description 那是春日里一个天气晴朗的好日子,你准备去见见你的老朋友Patrick,也是你之前的犯罪同伙。Patrick在编程竞赛上豪赌输掉了一大笔钱,所以他需…

git 远程仓库管理 分支创建、管理、查看、切换

作用&#xff1a; 区分生产环境代码以及开发环境代码研究新的功能或者攻关难题解决线上bug 特点&#xff1a; 项目开发中公用分支包括master、dev分支master是默认分支&#xff0c;用于发布&#xff0c;当需要发布时将dev分支合并到master分支分支dev是用于开发的分支&#…