一個簡單的依賴注入例子。html
1. 依賴 若是在 Class A 中,有 Class B 的實例,則稱 Class A 對 Class B 有一個依賴。例以下面類 Human 中用到一個 Father 對象,咱們就說類 Human 對類 Father 有一個依賴。函數
public class Human {單元測試
...學習
Father father;測試
...this
public Human() {spa
father = new Father();htm
}對象
}blog
仔細看這段代碼咱們會發現存在一些問題:
(1). 若是如今要改變 father 生成方式,如須要用new Father(String name)初始化 father,須要修改 Human 代碼;
(2). 若是想測試不一樣 Father 對象對 Human 的影響很困難,由於 father 的初始化被寫死在了 Human 的構造函數中;
(3). 若是new Father()過程很是緩慢,單測時咱們但願用已經初始化好的 father 對象 Mock 掉這個過程也很困難。
2. 依賴注入 上面將依賴在構造函數中直接初始化是一種 Hard init 方式,弊端在於兩個類不夠獨立,不方便測試。咱們還有另一種 Init 方式,以下:
public class Human {
...
Father father;
...
public Human(Father father) {
this.father = father;
}
}
上面代碼中,咱們將 father 對象做爲構造函數的一個參數傳入。在調用 Human 的構造方法以前外部就已經初始化好了 Father 對象。
像這種非本身主動初始化依賴,而經過外部來傳入依賴的方式,咱們就稱爲依賴注入。
如今咱們發現上面 1 中存在的兩個問題都很好解決了,簡單的說依賴注入主要有兩個好處:
(1). 解耦,將依賴之間解耦。
(2). 由於已經解耦,因此方便作單元測試,尤爲是 Mock 測試。
學習自:https://www.cnblogs.com/sunzhao/p/8334008.html