ioc和di的区别和关系(深入浅出之控制反转)
ioc和di的区别和关系(深入浅出之控制反转)
2024-11-22 07:55:44  作者:謌峩灭丗  网址:https://m.xinb2b.cn/life/qxs197539.html

控制反转(Inversion of Control,缩写为IoC)和依赖注入(Dependency Injection)在当今软件工程中占有举足轻重的地位,两者之间有着密不可分的联系。

接下来将深入浅出,举例说明什么是控制反转,什么是依赖注入,以及它们之间的关系。

什么是依赖注入?

依赖注入就是参数传递

上面的定义你也许会感到惊讶,就这?是的,就是这么简单。依赖注入是在一个类中以参数传递的形式引入另外的类,它本身是参数传递的一种形式。但是,反过来就不成立,参数传递不一定是依赖注入,可能是普通的参数,而非某个类。可能这么定义还不够清晰,下面的代码将帮助你理解,

class IocTest{ protected $logger; public function __constructor(DbLogger $logger){ $this->logger = $logger; } public function hello(){ $this->logger->hello(); }}

这里的IocTest类,通过依赖注入的方式引用了DbLogger类,这里假设DbLogger是将日志写入数据库。代码使用PHP编写,本身比较简单,可以使用任何面向对象的编程语言改写。

什么是控制反转?高等级的代码不能依赖低等级的代码;抽象接口不能依赖具体实现;

上面是控制反转的定义,同样比大多数文章描述的简单,定义本该这么简洁。所谓高等级的代码,可以理解为抽象类、接口、装饰类等等;所谓低等级的代码,可以理解为抽象类的具体实现,定义具体功能的类。这么说可能还是不够直观,还是举例说明,


IoC&DI

这张图比较主观的说明了什么是控制反转和依赖注入,同时也很好的说明了它们之间的关系。如果IocTest类依赖具体的类DbLogger,代码完全失去了灵活性,当我们需要将日志输出到文件,需要创建一个新的IocTest类,将依赖的DbLogger改成FileLogger,

class IocTest{ protected $logger; public function __constructor(FileLogger $logger){ $this->logger = $logger; } public function hello(){ $this->logger->hello(); }}

要解决这个问题,需要对DbLogger和FileLogger进行抽象,IocTest类依赖抽象类LoggerInterface,这样就实现了代码的解耦,IocTest不需要强依赖于具体类,增加了可扩展性。

总结控制反转解决代码的强耦合,增加了代码的可扩展性,这也就是为什么当今流行的框架Spring Boot和Laravel底层都是采用IoC;控制反转是为了实现更灵活的依赖注入,而非消灭依赖注入;当解决过度依赖,对具体类进行抽象的时候,便产生了Ioc,之后依赖注入的是抽象类。,
  • 四海为什么评分那么高(四海评价两极分化严重)
  • 2024-11-22四海评价两极分化严重四海电影你看过么?为什么不看,因为刘浩存?没了刘浩存,四海就是好电影了么刘浩存关于四海这个电影,观众呈现出截然不同的态度有观众说影片非常具有韩寒的风格,一个文艺的背井离乡的故事,为厌倦喧嚣的人提供了一。
  • 奥林匹斯星传宙斯知道自己身世(奥林匹斯星传诸神之王)
  • 2024-11-22奥林匹斯星传诸神之王动漫集合地,打破次元壁,欢迎大家的到来!二次元的大门永远为你敞开,我是二次元一生推的倾酱​倾酱说过,要送给大家一部浪漫的神话史,所以近期将会给大家分享《奥林匹斯星传》,倾酱超级喜欢的希腊神话故事​《奥。
  • 宠文穿越之嫡府千金(宠文相府唯一小千金要出阁了)
  • 2024-11-22宠文相府唯一小千金要出阁了《毒妃倾城:王爷别嚣张》(点击下方卡片,即可免费阅读)简介:她从天而降,凭借一张与他心爱之人一模一样的面容,被他强抢为妃原以为他只是暂时认错人,可没想到,他却将她娶为王妃,更是对她深宠入骨简评:莫颜点。
  • 情况说明怎么写(情况说明应该写什么)
  • 2024-11-22情况说明应该写什么情况说明书的写法:阐述明要说的事情、表达请自己的需要,情况说明需要措辞得当,表达清晰称呼,这个非常之重要,称呼是谁是你要把这个情况向谁说明第二步应该直奔整体,不能拖泥带水,把自己的情况全部讲清楚,最好。
  • fc和ft的区别
  • 2024-11-22fc和ft的区别ftfc,表示混凝土轴心抗压强度,fct,表示混凝土抗拉强度是指混凝土轴心抗拉强度混凝土轴心抗压强度例子:混凝土轴心抗压强度(fc)是采用150mm×150mm×300mm棱柱体作为标准试件所测得的抗。
  • 泰拉瑞亚战士徽章用处详解(泰拉瑞亚蠕虫围巾怎么获得)
  • 2024-11-22泰拉瑞亚蠕虫围巾怎么获得  泰拉瑞亚蠕虫围巾怎么获得?泰拉瑞亚中蠕虫围巾穿戴后可以使玩家所受伤害降低一部分,很多玩家都还不清楚这个装备要怎么获得,今天为大家带来了泰拉瑞亚蠕虫围巾获取攻略分享,一起来看看吧泰拉瑞亚蠕虫围巾获取。
  • cdr制作霓虹灯效果(cdr制作发光效果)
  • 2024-11-22cdr制作发光效果cdr怎么做发光效果,需要的是类似PS里的发光字效果,其实也挺简单的发个小教程有兴趣的可以试试看先看效果:第一步:打开CorelDraw画一个填充黑色的正方形第二步:打出自己想要的文字,第三步:将文字。
  • 福州连锁店打脸事件(福州这家店突然改名)
  • 2024-11-22福州这家店突然改名关注福州的陈先生最近向FM100.7福建交通应急广播求助称,位于福州市仓山区金山大道155-157号的永琪美容美发不知何时更名为灵格美容美发而他之前办理的永琪会员卡中数千元余额无法继续按会员价消费,和。
  • 中途岛海战日本航空兵都损失了吗(中途岛海战细节)
  • 2024-11-22中途岛海战细节作者:军事帅哥声明:兵说原创,违者必究电影《决战中途岛》让我思考一个问题:为什么日军在占有诸多优势的情况下,会大败而归?原因说起来有很多,但我认为日军的惨败和三个细节有重大关系零式战斗机为什么说日军占。
  • 有多少人觉得怒火重案是烂片(怒火重案破10亿大关)
  • 2024-11-22怒火重案破10亿大关经过为期28天的奋勇角逐,由陈木胜执导,甄子丹、谢霆锋主演的电影《怒火重案》,票房终于突破10亿大关!成绩剑指由刘德华主演的电影《拆弹专家2》创下的13.14亿港片票房冠军宝座!#怒火重案##刘德华。
  • 皮鞋放久了有霉味怎么办(皮鞋放久了有霉味去除方法)
  • 2024-11-22皮鞋放久了有霉味去除方法首先取出纸巾,平铺好待用下面取出一些茶叶,放到平铺的纸巾上即可接下来需要将茶叶裹在纸巾里面包好即可下面将裹有茶叶的纸巾放入到发霉的鞋子里面就可以了,接着静置一天即可最后鞋子里的霉味就可以去除掉了。
  • 小奶猫哈气超呆萌(这么可爱的布偶猫)
  • 2024-11-22这么可爱的布偶猫你好,这里是家有糯米初长成的御用铲屎官,我是老王,关注我,不迷路哦,每天学习猫咪的各种小知识网友和王思聪的合照4月11日,社交网站上突然曝出了一张网友和王思聪的合影,这张合影中除了王思聪本人和美女网友。