tft每日頭條

 > 職場

 > 中科互聯的面試題

中科互聯的面試題

職場 更新时间:2024-05-16 21:59:18

中科互聯的面試題(面試突擊73IoC和)1

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 裡面的調用就會報錯,如下圖所示:

中科互聯的面試題(面試突擊73IoC和)2

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

我們可以通過将對象傳遞而并 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(依賴注入)是一種具體的實現手段。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关職場资讯推荐

热门職場资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved