面試突擊73:IoC 和 DI 有什么區(qū)別?

IoC 和 DI 都是 Spring 框架中的重要概念结笨,就像玫瑰花與愛情一樣包晰,IoC 和 DI 通常情況下也是成對(duì)出現(xiàn)的湿镀。那 IoC 和 DI 什么關(guān)系和區(qū)別呢?接下來伐憾,我們一起來看勉痴。

1.IoC 介紹

IoC 是 Inversion of Control 的縮寫,翻譯成中文是“控制反轉(zhuǎn)”的意思树肃,它不是一個(gè)具體的技術(shù)蒸矛,而是一個(gè)實(shí)現(xiàn)對(duì)象解耦的思想。

要解釋什么是解耦胸嘴?就要了解什么是耦合雏掠,所謂的耦合是指:兩個(gè)或兩個(gè)以上對(duì)象存在依賴,當(dāng)一方修改之后會(huì)影響另一方劣像,那么就說這些對(duì)象間存在耦合乡话。而解耦就是解除兩個(gè)或兩個(gè)以上對(duì)象,修改之后影響另一方的問題耳奕。

那 IoC(控制反轉(zhuǎn))是如何實(shí)現(xiàn)解耦的呢绑青?

我們來舉一個(gè)例子,比如 A 對(duì)象中需要使用 B 對(duì)象的某個(gè)方法吮铭,那么我們通常的實(shí)現(xiàn)方法是這樣的:

class A {
    public void init() {
        // 調(diào)用 B 類中的 init 方法
        B b = new B();
        b.init();
    }
}
class B {
    public B() {
    }

    public void init() {
        System.out.println("你好时迫,世界。");
    }
}
復(fù)制代碼

然而此時(shí)對(duì)象 A 和對(duì)象 B 是存在耦合的谓晌,因?yàn)橐坏┬薷牧?B 對(duì)象構(gòu)造方法的參數(shù)之后掠拳,那么 A 對(duì)象里面的寫法也要跟著改變,比如當(dāng)我們將構(gòu)造方法改為以下代碼時(shí):

class B {
    public B(String name) {
        System.out.println("姓名:" + name);
    }
    public void init() {
        System.out.println("你好纸肉,世界溺欧。");
    }
}
復(fù)制代碼

此時(shí)構(gòu)造方法已經(jīng)從原本無參構(gòu)造方法變成了有參的構(gòu)造方法,這里不考慮構(gòu)造方法重載的情況柏肪,因?yàn)閷?shí)際業(yè)務(wù)中姐刁,很可能是 B 類的構(gòu)造方法寫錯(cuò)了,忘記加參數(shù)了烦味,于是后面又補(bǔ)充了一個(gè)參數(shù)聂使,此時(shí)是不需要對(duì)構(gòu)造方法進(jìn)行重載的,那么此時(shí)谬俄,之前對(duì)象 A 里面的調(diào)用就會(huì)報(bào)錯(cuò)柏靶,如下圖所示:
image.png

這就是開發(fā)中經(jīng)常遇到的一個(gè)問題,那怎么解決呢溃论?

我們可以通過將對(duì)象傳遞而并 new 對(duì)象的方式來解決屎蜓,如下代碼所示:

class A {
    // 先定義一個(gè)需要依賴的 B 對(duì)象
    private B b;
    // 通過構(gòu)造方法實(shí)現(xiàn)賦值(初始化)
    public A(B b) {
        this.b = b;
    }
    public void init() {
        // 調(diào)用 B 類中的 init 方法
        b.init();
    }
}
class B {
    public B(String name) {
        System.out.println("姓名:" + name);
    }
    public void init() {
        System.out.println("你好,世界钥勋。");
    }
}
復(fù)制代碼

這樣改造之后炬转,無論構(gòu)造方法怎么修改辆苔,即使需要加更多的參數(shù),而調(diào)用它的 A 類都無需做任何修改扼劈,這樣就實(shí)現(xiàn)了對(duì)象的解耦驻啤。

那這個(gè)解耦的示例和 IoC 有什么關(guān)系呢?

IoC 實(shí)現(xiàn)的思路和上述示例一樣测僵,就是通過將對(duì)象交給 Spring 中 IoC 容器管理街佑,在其他類中不直接 new 對(duì)象,而是通過將對(duì)象傳遞到當(dāng)前類的方式來實(shí)現(xiàn)解耦的捍靠。

小結(jié)

在 new 對(duì)象的時(shí)代沐旨,對(duì)象的管理權(quán)是由當(dāng)前類控制的,而有了 IoC 之后榨婆,對(duì)象的管理權(quán)就交給非當(dāng)前類的 IoC 容器管理了磁携,此時(shí)對(duì)象的管理權(quán)就發(fā)生了反轉(zhuǎn)和改變,這就是 IoC良风,這就是控制(權(quán))反轉(zhuǎn)谊迄。

2.DI 介紹

DI 是 Dependency Injection 的縮寫,翻譯成中文是“依賴注入”的意思烟央。依賴注入不是一種設(shè)計(jì)實(shí)現(xiàn)统诺,而是一種具體的技術(shù),它是在 IoC 容器運(yùn)行期間疑俭,動(dòng)態(tài)地將某個(gè)依賴對(duì)象注入到當(dāng)前對(duì)象的技術(shù)就叫做 DI(依賴注入)粮呢。

在上述示例中,A 類在使用 B 類時(shí)钞艇,就是通過構(gòu)造方法將依賴對(duì)象 B 引入的啄寡,這種實(shí)現(xiàn)方法就可以看作是通過構(gòu)造方法實(shí)現(xiàn)依賴注入的手段,具體代碼如下:

class A {
    // 先定義一個(gè)需要依賴的 B 對(duì)象
    private B b;
    // 通過構(gòu)造方法實(shí)現(xiàn)賦值
    public A(B b) {
        this.b = b;
    }
    public void init() {
        // 調(diào)用 B 類中的 init 方法
        b.init();
    }
}
復(fù)制代碼

3.IoC VS DI

從上面的內(nèi)容中我們可以看出哩照,IoC 和 DI 雖然定義不同挺物,但它們所做的事情都是一樣的,都是用來實(shí)現(xiàn)對(duì)象解耦的飘弧,而二者又有所不同:IoC 是一種設(shè)計(jì)思想识藤,而 DI 是一種具體的實(shí)現(xiàn)技術(shù)

比如次伶,磊哥今天心情比較好蹋岩,想出去吃頓好的,那么“想吃頓好的”就是一種思想学少、就是 IoC。

但什么才是“好的(飯)”呢秧骑?海底撈還是韓式料理版确?具體吃什么是 DI扣囊。

因此“磊哥今天心情比較好,想出去吃頓好的”是一種思想绒疗、是 IoC侵歇,而吃一頓海底撈而非韓式料理就是具體的實(shí)現(xiàn)、是 DI吓蘑。

總結(jié)

IoC 和 DI 都是 Spring 框架中的重要概念惕虑,它們都是用來實(shí)現(xiàn)對(duì)象解耦的,其中 IoC(控制反轉(zhuǎn))是一種設(shè)計(jì)思想磨镶,而 DI(依賴注入)是一種具體的實(shí)現(xiàn)手段溃蔫。

作者:Java中文社群
鏈接:https://juejin.cn/post/7130040421731794974
來源:稀土掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)琳猫,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處伟叛。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市脐嫂,隨后出現(xiàn)的幾起案子统刮,更是在濱河造成了極大的恐慌,老刑警劉巖账千,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侥蒙,死亡現(xiàn)場離奇詭異,居然都是意外死亡匀奏,警方通過查閱死者的電腦和手機(jī)鞭衩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來攒射,“玉大人醋旦,你說我怎么就攤上這事』岱牛” “怎么了饲齐?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長咧最。 經(jīng)常有香客問我捂人,道長,這世上最難降的妖魔是什么矢沿? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任滥搭,我火速辦了婚禮,結(jié)果婚禮上捣鲸,老公的妹妹穿的比我還像新娘瑟匆。我一直安慰自己,他們只是感情好栽惶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布愁溜。 她就那樣靜靜地躺著疾嗅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪冕象。 梳的紋絲不亂的頭發(fā)上代承,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音渐扮,去河邊找鬼论悴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛墓律,可吹牛的內(nèi)容都是我干的膀估。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼只锻,長吁一口氣:“原來是場噩夢啊……” “哼玖像!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起齐饮,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤捐寥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后祖驱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體握恳,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年捺僻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乡洼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡匕坯,死狀恐怖束昵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情葛峻,我是刑警寧澤锹雏,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站术奖,受9級(jí)特大地震影響礁遵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜采记,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一佣耐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧唧龄,春花似錦兼砖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽然走。三九已至,卻和暖如春戏挡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晨仑。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國打工褐墅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人洪己。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓妥凳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親答捕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子逝钥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容