摘要:前言最近在使用框架,看了下他的源碼,發(fā)現(xiàn)有很多地方也用到了依賴注入控制反轉(zhuǎn),覺(jué)得有必要和大家簡(jiǎn)單聊一聊什么是依賴注入以及怎么使用它。概念依賴注入和控制反轉(zhuǎn)是對(duì)同一件事情的不同描述,從某個(gè)方面講,就是它們描述的角度不同。
前言
最近在使用ThinkPHP5框架,看了下他的源碼,發(fā)現(xiàn)有很多地方也用到了依賴注入(控制反轉(zhuǎn)),覺(jué)得有必要和大家簡(jiǎn)單聊一聊什么是依賴注入以及怎么使用它。
簡(jiǎn)介IoC - Inversion of Control 控制反轉(zhuǎn) DI - Dependency Injection 依賴注入
依賴注入和控制反轉(zhuǎn)說(shuō)的實(shí)際上是同一個(gè)東西,它們是一種設(shè)計(jì)模式,這種設(shè)計(jì)模式用來(lái)減少程序間的耦合
優(yōu)勢(shì)(為什么使用)使用依賴注入,最重要的一點(diǎn)好處就是有效的分離了對(duì)象和它所需要的外部資源,使得它們松散耦合,有利于功能復(fù)用,更重要的是使得程序的整個(gè)體系結(jié)構(gòu)變得非常靈活。
概念依賴注入和控制反轉(zhuǎn)是對(duì)同一件事情的不同描述,從某個(gè)方面講,就是它們描述的角度不同。
依賴注入是從應(yīng)用程序的角度在描述,可以把依賴注入,即:應(yīng)用程序依賴容器創(chuàng)建并注入它所需要的外部資源;
而控制反轉(zhuǎn)是從容器的角度在描述,即:容器控制應(yīng)用程序,由容器反向的向應(yīng)用程序注入應(yīng)用程序所需要的外部資源。
問(wèn)答對(duì)于一個(gè)菜鳥(niǎo),如果你看了上面的概念還是一頭霧水的話,那么恭喜你,你和我一樣不是天才,那么下面就讓我們借助于幾個(gè)問(wèn)答來(lái)搞清楚這個(gè)概念的意思吧。
問(wèn)題整個(gè)過(guò)程中參與者都有誰(shuí)?
依賴:誰(shuí)依賴于誰(shuí)?為什么需要依賴?
注入:誰(shuí)注入于誰(shuí)?到底注入了什么?
控制反轉(zhuǎn):誰(shuí)控制誰(shuí)?控制什么?為何叫反轉(zhuǎn)(有反轉(zhuǎn)就應(yīng)該有正轉(zhuǎn)了,正轉(zhuǎn)是什么呢?)
依賴注入和控制反轉(zhuǎn)是同一概念嗎?
回答
整個(gè)過(guò)程中參與者都有誰(shuí)?
一般有三方參與者,一個(gè)是某個(gè)對(duì)象;一個(gè)是IoC/DI的容器;另一個(gè)是某個(gè)對(duì)象的外部資源。 某個(gè)對(duì)象指的就是任意的、普通的PHP對(duì)象; IoC/DI的容器簡(jiǎn)單點(diǎn)說(shuō)就是指用來(lái)實(shí)現(xiàn)IoC/DI功能的一個(gè)框架程序; 對(duì)象的外部資源指的就是對(duì)象需要的,但是是從對(duì)象外部獲取的,都統(tǒng)稱資源,比如:對(duì)象需要的其它對(duì)象、或者是對(duì)象需要的文件資源等等。
誰(shuí)依賴于誰(shuí):
當(dāng)然是某個(gè)對(duì)象依賴于IoC/DI的容器
為什么需要依賴:
對(duì)象需要IoC/DI的容器來(lái)提供對(duì)象需要的外部資源
誰(shuí)注入于誰(shuí):
是IoC/DI的容器 注入 某個(gè)對(duì)象
到底注入什么:
就是注入某個(gè)對(duì)象所需要的外部資源
誰(shuí)控制誰(shuí):
當(dāng)然是IoC/DI的容器來(lái)控制對(duì)象了
控制什么:
主要是控制對(duì)象實(shí)例的創(chuàng)建
為何叫反轉(zhuǎn):
反轉(zhuǎn)是相對(duì)于正向而言的,那么什么算是正向的呢? 考慮一下常規(guī)情況下的應(yīng)用程序,如果要在A里面使用C,你會(huì)怎么做呢?當(dāng)然是直接去創(chuàng)建C的對(duì)象,也就是說(shuō),是在A類中主動(dòng)去獲取所需要的外部資源C($c = new C();),這種情況被稱為正向的。那么什么是反向呢?就是A類不再主動(dòng)去獲取C,而是被動(dòng)等待,等待IoC/DI的容器獲取一個(gè)C的實(shí)例,然后反向的注入到A類中。 用圖例來(lái)說(shuō)明一下,先看沒(méi)有IoC/DI的時(shí)候,常規(guī)的A類使用C類的示意圖,如下圖所示:
代碼示意:
c = new C(); // 實(shí)例化創(chuàng)建C類 } public function sayC() { echo $this->c->say(); // 調(diào)用C類中的方法 } } $a = new a(); $a->sayC();
當(dāng)有了IoC/DI的容器后,A類不再主動(dòng)去創(chuàng)建C了,如下圖所示:
而是被動(dòng)等待,等待IoC/DI的容器獲取一個(gè)C的實(shí)例,然后反向的注入到A類中,如下圖所示:
代碼示意:
c = $c; // 實(shí)例化創(chuàng)建C類 } public function sayC() { echo $this->c->say(); // 調(diào)用C類中的方法 } } $c = new C(); $a = new a(); $a->setC($c); $a->sayC();
9.什么是正轉(zhuǎn)?正轉(zhuǎn)就是按照普通的我們?cè)兕愔兄苯觿?chuàng)建對(duì)象實(shí)例,如 $c = new C();
10.依賴注入和控制反轉(zhuǎn)是同一概念嗎?
根據(jù)上面的講述,我們不難出來(lái),`依賴注入`和`控制反轉(zhuǎn)`確實(shí)是對(duì)同一件事情的不同描述,從某個(gè)方面講,就是它們描述的`角度`不同。總結(jié)
其實(shí)IoC/DI對(duì)編程帶來(lái)的最大改變不是從代碼上,而是從思想上,發(fā)生了“主從換位”的變化。應(yīng)用程序原本是老大,要獲取什么資源都是主動(dòng)出擊,但是在IoC/DI思想中,應(yīng)用程序就變成被動(dòng)的了,被動(dòng)的等待IoC/DI容器來(lái)創(chuàng)建并注入它所需要的資源了。
注意我們上面說(shuō)了,這是一種“設(shè)計(jì)模式”,就像“工廠模式”和“單例模式”等是一樣的,它是一種面向?qū)ο笾械木幊獭八枷搿?,自然它也不僅限于PHP,而是所有面向?qū)ο蟮恼Z(yǔ)言基本都是可以適用的。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/21949.html
摘要:依賴注入控制反轉(zhuǎn)的一種具體實(shí)現(xiàn)方法。接下來(lái),我們使用依賴注入實(shí)現(xiàn)控制反轉(zhuǎn),使依賴關(guān)系倒置依賴被動(dòng)傳入。從單元測(cè)試的角度看,依賴注入更方便和操作,方便了測(cè)試人員寫出質(zhì)量更高的測(cè)試代碼。 前言 好的設(shè)計(jì)會(huì)提高程序的可復(fù)用性和可維護(hù)性,也間接的提高了開(kāi)發(fā)人員的生產(chǎn)力。今天,我們就來(lái)說(shuō)一下在很多框架中都使用的依賴注入。 一些概念 要搞清楚什么是依賴注入如何依賴注入,首先我們要明確一些概念。 D...
摘要:構(gòu)造器注入實(shí)現(xiàn)特定參數(shù)的構(gòu)造函數(shù),在新建對(duì)象時(shí)傳入所依賴類型的對(duì)象。 基本概念 1.依賴倒置(反轉(zhuǎn))原則(DIP):一種軟件架構(gòu)設(shè)計(jì)的原則(抽象概念,是一種思想)在面向?qū)ο缶幊填I(lǐng)域中,依賴反轉(zhuǎn)原則(Dependency inversion principle,DIP)是指一種特定的解耦(傳統(tǒng)的依賴關(guān)系創(chuàng)建在高層次上,而具體的策略設(shè)置則應(yīng)用在低層次的模塊上)形式,使得高層次的模塊不依賴于...
摘要:工廠模式,依賴轉(zhuǎn)移當(dāng)然,實(shí)現(xiàn)控制反轉(zhuǎn)的方法有幾種。其實(shí)我們稍微改造一下這個(gè)類,你就明白,工廠類的真正意義和價(jià)值了。雖然如此,工廠模式依舊十分優(yōu)秀,并且適用于絕大多數(shù)情況。 此篇文章轉(zhuǎn)載自laravel-china,chongyi的文章https://laravel-china.org/top...原文地址: http://www.insp.top/learn-lar... ,轉(zhuǎn)載務(wù)必保...
摘要:本文一大半內(nèi)容都是通過(guò)舉例來(lái)讓讀者去理解什么是控制反轉(zhuǎn)和依賴注入,通過(guò)理解這些概念,來(lái)更加深入。這種由外部負(fù)責(zé)其依賴需求的行為,我們可以稱其為控制反轉(zhuǎn)。工廠模式,依賴轉(zhuǎn)移當(dāng)然,實(shí)現(xiàn)控制反轉(zhuǎn)的方法有幾種。 容器,字面上理解就是裝東西的東西。常見(jiàn)的變量、對(duì)象屬性等都可以算是容器。一個(gè)容器能夠裝什么,全部取決于你對(duì)該容器的定義。當(dāng)然,有這樣一種容器,它存放的不是文本、數(shù)值,而是對(duì)象、對(duì)象的描...
摘要:對(duì)象之間耦合度過(guò)高的系統(tǒng),必然會(huì)出現(xiàn)牽一發(fā)而動(dòng)全身的情形。控制被反轉(zhuǎn)之后,獲得依賴對(duì)象的過(guò)程由自身管理變?yōu)榱擞扇萜髦鲃?dòng)注入。于是,他給控制反轉(zhuǎn)取了一個(gè)更合適的名字叫做依賴注入。 Spring還可以這么學(xué)--IoC(控制反轉(zhuǎn)) / DI(依賴注入)理解 聲明:文章的前三部分參考博文:https://www.cnblogs.com/Nouno...這篇文章首發(fā)是在我的個(gè)人微信訂閱號(hào)每天學(xué)編...
閱讀 2193·2021-11-24 09:38
閱讀 3255·2021-11-08 13:27
閱讀 3095·2021-09-10 10:51
閱讀 3162·2019-08-29 12:20
閱讀 674·2019-08-28 18:28
閱讀 3470·2019-08-26 11:53
閱讀 2718·2019-08-26 11:46
閱讀 1527·2019-08-26 10:56