不久前自己曾研究過Dagger2,但是覺得比較晦澀,再加上專案中沒有運用到,就沒有繼續看下去。但近日發現 MVP + Retrofit + Rxjava + Dagger2 的 andoroid 專案框架如此流行,覺得應接著搞一波了。
- 該系列部落格的最終目標: 搭建 MVP + Dagger2 框架
- 該系列部落格包含以下幾篇內容:
- Dagger 2 系列(一) -- 前奏篇:依賴注入的基本介紹
- Dagger 2 系列(二) -- 基礎篇:@Inject、@Component
- Dagger 2 系列(三) -- 基礎篇:@Module 和@Provides
- Dagger 2 系列(四) -- 基礎篇:@Named 和 @Qualifier
- Dagger 2 系列(五) -- 進階篇:@Scope 和 @Singleton
一、What is Dagger2 ?
Dagger2 是一個谷歌開源的依賴注入(Dependency Injection
)框架,簡稱DI
。Dagger2 是 Google 出的依賴注入框架。肯定有小夥伴疑問,為什麼會有個 2 呢。該框架是基於 Square 開發的 Dagger 基礎上開發的。
那麼 什麼是 依賴注入
呢?
1.1 何為依賴注入(控制反轉 -- IOC(Inversion of Control))
我在網上搜尋了相關內容,覺得以下解釋相對容易理解(自定義後):
- 在一個類的具體業務邏輯中,需要另一個類的例項進行相應的操作時,在傳統的設計中,通常由呼叫者來建立被呼叫者的例項(一般的,我們通過 new 的方式建立),然而依賴注入的方式,建立被呼叫者不再由呼叫者建立例項,建立被呼叫者的例項的工作由
IOC 容器
來完成,然後注入
到呼叫者。因此也被稱為依賴注入
。 依賴注入
就是呼叫者需要的另一個物件例項不在呼叫者內部實現,而是通過一定的方式從外部傳入例項,解決了各個類之間的耦合
。那麼這個外部,到底指的是哪裡,如果指的是另一個類,那麼,另一個類內部就耦合了,這種拆東牆補西牆的做法我們是不推薦的。能不能有一種方式,將這些構造的物件放到一個容器中,具體需要哪個例項時,就從這個容器中取就行了。那麼,類的例項和使用就不在有聯絡了,而是通過一個容器將他們聯絡起來。實現瞭解耦。
個人理解:控制反轉 -- 把自己新建例項物件的權利由交給了第三方工具或容器。 目標類將建立其他例項類的權利交給了第三方工具,也就是說,原來需要程式設計師把自主在目標類通過 new 的方式建立相關類的例項的權利,交給具體的業務(所謂的 IOC 容器) ,該容器在需要的時候通過它自己的方式建立該類的例項,即:
建立類例項權利的移交
。
1.2 依賴注入的好處
依賴注入
就是呼叫者需要的另一個物件例項不在呼叫者內部實現,而是通過一定的方式從外部傳入例項,解決了各個類之間的耦合
。
通俗一點講:將該物件的例項化交給其呼叫者,通過某種方式傳入進來,這種模式就是依賴注入。常見的降低耦合的方式:
- 構造方法注入。
- Setter方式注入。
- 介面注入。
二、Why Dagger2
Dagger2 的原理是在編譯期生成相應的依賴注入程式碼
。這也是和其他依賴注入框架不同的地方,其他框架是在執行時期反射獲取註解內容,影響了執行效率。
栗子
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 學習前的基本概念的介紹,歡迎參考指正。
參考文章