成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試突擊:IoC 和 DI 有什么區別?

開發 架構
IoC 和 DI 都是 Spring 框架中的重要概念,它們都是用來實現對象解耦的,其中 IoC(控制反轉)是一種設計思想,而 DI(依賴注入)是一種具體的實現手段。

作者 | 磊哥

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

轉載請聯系授權(微信ID:GG_Stone)

IoC 和 DI 都是 Spring 框架中的重要概念,就像玫瑰花與愛情一樣,IoC 和 DI 通常情況下也是成對出現的。那 IoC 和 DI 什么關系和區別呢?接下來,我們一起來看。

1、IoC 介紹

IoC 是 Inversion of Control 的縮寫,翻譯成中文是“控制反轉”的意思,它不是一個具體的技術,而是一個實現對象解耦的思想。

要解釋什么是解耦?就要了解什么是耦合,所謂的耦合是指:兩個或兩個以上對象存在依賴,當一方修改之后會影響另一方,那么就說這些對象間存在耦合。而解耦就是解除兩個或兩個以上對象,修改之后影響另一方的問題。

那 IoC(控制反轉)是如何實現解耦的呢?

我們來舉一個例子,比如 A 對象中需要使用 B 對象的某個方法,那么我們通常的實現方法是這樣的:

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

public void init() {
System.out.println("你好,世界。");
}
}

然而此時對象 A 和對象 B 是存在耦合的,因為一旦修改了 B 對象構造方法的參數之后,那么 A 對象里面的寫法也要跟著改變,比如當我們將構造方法改為以下代碼時:

class B {
public B(String name) {
System.out.println("姓名:" + name);
}
public void init() {
System.out.println("你好,世界。");
}
}

此時構造方法已經從原本無參構造方法變成了有參的構造方法,這里不考慮構造方法重載的情況,因為實際業務中,很可能是 B 類的構造方法寫錯了,忘記加參數了,于是后面又補充了一個參數,此時是不需要對構造方法進行重載的,那么此時,之前對象 A 里面的調用就會報錯,如下圖所示:

圖片

這就是開發中經常遇到的一個問題,那怎么解決呢?

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

class A {
// 先定義一個需要依賴的 B 對象
private B b;
// 通過構造方法實現賦值(初始化)
public A(B b) {
this.b = b;
}
public void init() {
// 調用 B 類中的 init 方法
b.init();
}
}
class B {
public B(String name) {
System.out.println("姓名:" + name);
}
public void init() {
System.out.println("你好,世界。");
}
}

這樣改造之后,無論構造方法怎么修改,即使需要加更多的參數,而調用它的 A 類都無需做任何修改,這樣就實現了對象的解耦。

那這個解耦的示例和 IoC 有什么關系呢?

IoC 實現的思路和上述示例一樣,就是通過將對象交給 Spring 中 IoC 容器管理,在其他類中不直接 new 對象,而是通過將對象傳遞到當前類的方式來實現解耦的。

小結

在 new 對象的時代,對象的管理權是由當前類控制的,而有了 IoC 之后,對象的管理權就交給非當前類的 IoC 容器管理了,此時對象的管理權就發生了反轉和改變,這就是 IoC,這就是控制(權)反轉。

2、DI 介紹

DI 是 Dependency Injection 的縮寫,翻譯成中文是“依賴注入”的意思。依賴注入不是一種設計實現,而是一種具體的技術,它是在 IoC 容器運行期間,動態地將某個依賴對象注入到當前對象的技術就叫做 DI(依賴注入)。

在上述示例中,A 類在使用 B 類時,就是通過構造方法將依賴對象 B 引入的,這種實現方法就可以看作是通過構造方法實現依賴注入的手段,具體代碼如下:

class A {
// 先定義一個需要依賴的 B 對象
private B b;
// 通過構造方法實現賦值
public A(B b) {
this.b = b;
}
public void init() {
// 調用 B 類中的 init 方法
b.init();
}
}

3、IoC VS DI

從上面的內容中我們可以看出,IoC 和 DI 雖然定義不同,但它們所做的事情都是一樣的,都是用來實現對象解耦的,而二者又有所不同:IoC 是一種設計思想,而 DI 是一種具體的實現技術。

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

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

因此“磊哥今天心情比較好,想出去吃頓好的”是一種思想、是 IoC,而吃一頓海底撈而非韓式料理就是具體的實現、是 DI。?

總結

IoC 和 DI 都是 Spring 框架中的重要概念,它們都是用來實現對象解耦的,其中 IoC(控制反轉)是一種設計思想,而 DI(依賴注入)是一種具體的實現手段。

責任編輯:姜華 來源: Java面試真題解析
相關推薦

2022-08-22 07:06:32

MyBatisSQL占位符

2022-02-08 07:02:32

進程線程操作系統

2022-08-15 07:06:50

Propertiesyml配置

2022-08-03 07:04:56

GETHTTPPOST

2022-04-24 07:59:53

synchronizJVMAPI

2023-03-26 21:51:42

2022-04-26 08:02:00

locktryLocklockInterr

2022-05-09 07:37:04

Java非公平鎖公平鎖

2022-10-09 20:52:19

事務隔離級別傳播機制

2022-03-16 07:33:40

守護線程用戶線程語言

2022-08-29 07:05:02

JSRJava語言

2022-01-11 06:53:23

面試重寫重載

2022-07-18 07:11:35

請求轉發請求重定數據共享

2023-02-17 08:02:45

@Autowired@Resource

2023-02-01 07:15:16

2023-02-17 08:10:24

2022-06-13 07:36:06

MySQLInnoDB索引

2024-04-03 15:33:04

JWTSession傳輸信息

2024-09-19 08:42:43

2024-09-24 13:49:13

SQL數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人精品在线观看 | 欧美在线视频一区 | 免费一区 | 欧美日韩免费 | 欧美黄视频 | 福利电影在线 | 国产视频h| 国产999在线观看 | 欧美视频中文字幕 | 性色av香蕉一区二区 | 久久99精品国产99久久6男男 | 免费人成在线观看网站 | 免费观看一级视频 | 精品亚洲一区二区三区四区五区 | 亚洲第一女人av | 日本视频中文字幕 | 欧美一区二区三区四区在线 | 欧美综合久久 | 久久久www成人免费精品 | 国产精品久久久久久久久久久久冷 | 国产精品毛片久久久久久久 | 欧美成ee人免费视频 | 日韩av免费在线观看 | 成人国产精品久久 | 亚洲激情一级片 | 国产精品视频网 | 午夜电影在线播放 | 成人av观看| 四虎伊人 | 日韩免费视频一区二区 | 欧美午夜视频 | 全部免费毛片在线播放网站 | 中文字幕在线观看一区二区 | 欧美在线观看一区 | 久久久久久成人 | 大久| 日韩伦理一区二区 | 超碰在线观看97 | 黄网站在线播放 | 在线观看av网站永久 | 日韩中文在线视频 |