不久前本身曾研究過Dagger2,可是以爲比較晦澀,再加上項目中沒有運用到,就沒有繼續看下去。但近日發現 MVP + Retrofit + Rxjava + Dagger2 的 andoroid 項目框架如此流行,以爲應接着搞一波了。html
Dagger2 是一個谷歌開源的依賴注入(Dependency Injection
)框架,簡稱DI
。Dagger2 是 Google 出的依賴注入框架。確定有小夥伴疑問,爲何會有個 2 呢。該框架是基於 Square 開發的 Dagger 基礎上開發的。 那麼 什麼是 依賴注入
呢?java
我在網上搜索了相關內容,以爲如下解釋相對容易理解(自定義後):git
IOC 容器
來完成,而後注入
到調用者。所以也被稱爲 依賴注入
。依賴注入
就是調用者須要的另外一個對象實例不在調用者內部實現,而是經過必定的方式從外部傳入實例,解決了各個類之間的耦合
。那麼這個外部,到底指的是哪裏,若是指的是另外一個類,那麼,另外一個類內部就耦合了,這種拆東牆補西牆的作法咱們是不推薦的。能不能有一種方式,將這些構造的對象放到一個容器中,具體須要哪一個實例時,就從這個容器中取就好了。那麼,類的實例和使用就不在有聯繫了,而是經過一個容器將他們聯繫起來。實現瞭解耦。我的理解:控制反轉 -- 把本身新建實例對象的權利由交給了第三方工具或容器。 目標類將建立其餘實例類的權利交給了第三方工具,也就是說,原來須要程序員把自主在目標類經過 new 的方式建立相關類的實例的權利,交給具體的業務(所謂的 IOC 容器) ,該容器在須要的時候經過它本身的方式建立該類的實例,即:
建立類實例權利的移交
。程序員
依賴注入
就是調用者須要的另外一個對象實例不在調用者內部實現,而是經過必定的方式從外部傳入實例,解決了各個類之間的耦合
。github
通俗一點講:將該對象的實例化交給其調用者,經過某種方式傳入進來,這種模式就是依賴注入。常見的下降耦合的方式:bash
Dagger2 的原理是在編譯期生成相應的依賴注入代碼
。這也是和其餘依賴注入框架不一樣的地方,其餘框架是在運行時期反射獲取註解內容,影響了運行效率。框架
栗子ide
public class MainClass {
private void main(String [] args){
John john = new John("john",12);
john.introduceSelf();
}
}
複製代碼
上面例子面臨着一個問題,一旦 John
的建立方式(如構造參數)發生改變,那麼你不但須要修改 MainClass
中建立John
的代碼,還要修改其餘全部地方建立 John
的代碼。若是咱們使用了Dagger2
的話,就不須要管這些了,只須要在須要John
的地方寫下:工具
@Inject
John john;
複製代碼
PS:以上就是 Dagger2 學習前的基本概念的介紹,歡迎參考指正。post
參考文章