公共技術點之依賴注入

前言

最近沒啥工作任務,看資料學習中。這是我看到的最簡潔明瞭的一篇關於依賴注入的文章,扔物線大神寫的,分享一下。不得不讚,邏輯清晰,文字簡潔,以後寫文章可以學習一下他的寫法和表達思路。


《公共技術點之依賴注入》

 —— 分析者:扔物線,校對者:Trinea

依賴

如果在 Class A 中,有 Class B 的實例,則稱 Class A 對 Class B 有一個依賴。例如下面類 Human 中用到一個 Father 對象,我們就說類 Human 對類 Father 有一個依賴。

public class Human {

Father father;

public Human() {
father = new Father();
}
}

仔細看這段代碼我們會發現存在一些問題:
(1). 如果現在要改變 father 生成方式,如需要用new Father(String name)初始化 father,需要修改 Human 代碼;
(2). 如果想測試不同 Father 對象對 Human 的影響很困難,因爲 father 的初始化被寫死在了 Human 的構造函數中;
(3). 如果new Father()過程非常緩慢,單測時我們希望用已經初始化好的 father 對象 Mock 掉這個過程也很困難。

依賴注入

上面將依賴在構造函數中直接初始化是一種 Hard init 方式,弊端在於兩個類不夠獨立,不方便測試。我們還有另外一種 Init 方式,如下:

public class Human {

Father father;

public Human(Father father) {
this.father = father;
}
}

上面代碼中,我們將 father 對象作爲構造函數的一個參數傳入。在調用 Human 的構造方法之前外部就已經初始化好了 Father 對象。像這種非自己主動初始化依賴,而通過外部來傳入依賴的方式,我們就稱爲依賴注入。
現在我們發現上面 1 中存在的兩個問題都很好解決了,簡單的說依賴注入主要有兩個好處:
(1). 解耦,將依賴之間解耦。
(2). 因爲已經解耦,所以方便做單元測試,尤其是 Mock 測試。
3. Java 中的依賴注入

依賴注入的實現有多種途徑,而在 Java 中,使用註解是最常用的。通過在字段的聲明前添加 @Inject 註解進行標記,來實現依賴對象的自動注入。

public class Human {

@Inject Father father;

public Human() {
}
}

上面這段代碼看起來很神奇:只是增加了一個註解,Father 對象就能自動注入了?這個注入過程是怎麼完成的?

實質上,如果你只是寫了一個 @Inject 註解,Father 並不會被自動注入。你還需要使用一個依賴注入框架,並進行簡單的配置。現在 Java 語言中較流行的依賴注入框架有 Google Guice、Spring 等,而在 Android 上比較流行的有 RoboGuice、Dagger 等。其中 Dagger 是我現在正在項目中使用的。如果感興趣,你可以到 Dagger 實現原理解析 瞭解更多依賴注入和 Dagger 實現原理相關信息。

Dagger 實現原理

原文鏈接 : Dagger 源碼解析 —— 分析者:扔物線

發佈了40 篇原創文章 · 獲贊 126 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章