自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

作者 | 磊哥

來源 | Java面試真題解析(ID:aimianshi666)

轉(zhuǎn)載請(qǐng)聯(lián)系授權(quán)(微信ID:GG_Stone)

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("你好,世界。");
}
}

然而此時(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("你好,世界。");
}
}

此時(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ò),如下圖所示:

圖片

這就是開發(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("你好,世界。");
}
}

這樣改造之后,無論構(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();
}
}

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)手段。

責(zé)任編輯:姜華 來源: Java面試真題解析
相關(guān)推薦

2022-08-22 07:06:32

MyBatisSQL占位符

2022-08-03 07:04:56

GETHTTPPOST

2022-04-24 07:59:53

synchronizJVMAPI

2022-02-08 07:02:32

進(jìn)程線程操作系統(tǒng)

2022-08-15 07:06:50

Propertiesyml配置

2023-03-26 21:51:42

2022-04-26 08:02:00

locktryLocklockInterr

2022-10-09 20:52:19

事務(wù)隔離級(jí)別傳播機(jī)制

2022-05-09 07:37:04

Java非公平鎖公平鎖

2022-03-16 07:33:40

守護(hù)線程用戶線程語言

2022-08-29 07:05:02

JSRJava語言

2022-01-11 06:53:23

面試重寫重載

2022-07-18 07:11:35

請(qǐng)求轉(zhuǎn)發(fā)請(qǐng)求重定數(shù)據(jù)共享

2023-02-17 08:02:45

@Autowired@Resource

2023-02-17 08:10:24

2023-02-01 07:15:16

2024-04-03 15:33:04

JWTSession傳輸信息

2024-09-19 08:42:43

2022-06-13 07:36:06

MySQLInnoDB索引

2024-09-24 13:49:13

SQL數(shù)據(jù)庫
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)