Dagger 2 系列(一) -- 前奏篇:依賴注入的基本介紹

leeGYPlus發表於2018-09-21

Dagger2

不久前自己曾研究過Dagger2,但是覺得比較晦澀,再加上專案中沒有運用到,就沒有繼續看下去。但近日發現 MVP + Retrofit + Rxjava + Dagger2 的 andoroid 專案框架如此流行,覺得應接著搞一波了。

  • 該系列部落格的最終目標: 搭建 MVP + Dagger2 框架
  • 該系列部落格包含以下幾篇內容:
  1. Dagger 2 系列(一) -- 前奏篇:依賴注入的基本介紹
  2. Dagger 2 系列(二) -- 基礎篇:@Inject、@Component
  3. Dagger 2 系列(三) -- 基礎篇:@Module 和@Provides
  4. Dagger 2 系列(四) -- 基礎篇:@Named 和 @Qualifier
  5. Dagger 2 系列(五) -- 進階篇:@Scope 和 @Singleton

一、What is Dagger2 ?

Dagger2 是一個谷歌開源的依賴注入(Dependency Injection)框架,簡稱DI。Dagger2 是 Google 出的依賴注入框架。肯定有小夥伴疑問,為什麼會有個 2 呢。該框架是基於 Square 開發的 Dagger 基礎上開發的。 那麼 什麼是 依賴注入 呢?

1.1 何為依賴注入(控制反轉 -- IOC(Inversion of Control))

我在網上搜尋了相關內容,覺得以下解釋相對容易理解(自定義後):

  1. 在一個類的具體業務邏輯中,需要另一個類的例項進行相應的操作時,在傳統的設計中,通常由呼叫者來建立被呼叫者的例項(一般的,我們通過 new 的方式建立),然而依賴注入的方式,建立被呼叫者不再由呼叫者建立例項,建立被呼叫者的例項的工作由 IOC 容器 來完成,然後注入到呼叫者。因此也被稱為 依賴注入
  2. 依賴注入 就是呼叫者需要的另一個物件例項不在呼叫者內部實現,而是通過一定的方式從外部傳入例項,解決了各個類之間的耦合。那麼這個外部,到底指的是哪裡,如果指的是另一個類,那麼,另一個類內部就耦合了,這種拆東牆補西牆的做法我們是不推薦的。能不能有一種方式,將這些構造的物件放到一個容器中,具體需要哪個例項時,就從這個容器中取就行了。那麼,類的例項和使用就不在有聯絡了,而是通過一個容器將他們聯絡起來。實現瞭解耦。

個人理解:控制反轉 -- 把自己新建例項物件的權利由交給了第三方工具或容器。 目標類將建立其他例項類的權利交給了第三方工具,也就是說,原來需要程式設計師把自主在目標類通過 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 學習前的基本概念的介紹,歡迎參考指正。

參考文章


Dagger 詳解

這就是Dagger2

Dagger2 入門實踐

最簡單的Dagger2入門教程

Android:dagger2讓你愛不釋手-終結篇

相關文章