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

Dagger2

不久前本身曾研究過Dagger2,可是以爲比較晦澀,再加上項目中沒有運用到,就沒有繼續看下去。但近日發現 MVP + Retrofit + Rxjava + Dagger2 的 andoroid 項目框架如此流行,以爲應接着搞一波了。html

  • 該系列博客的最終目標: 搭建 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

1、What is Dagger2 ?

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

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

我在網上搜索了相關內容,以爲如下解釋相對容易理解(自定義後):git

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

我的理解:控制反轉 -- 把本身新建實例對象的權利由交給了第三方工具或容器。 目標類將建立其餘實例類的權利交給了第三方工具,也就是說,原來須要程序員把自主在目標類經過 new 的方式建立相關類的實例的權利,交給具體的業務(所謂的 IOC 容器) ,該容器在須要的時候經過它本身的方式建立該類的實例,即:建立類實例權利的移交程序員

1.2 依賴注入的好處

依賴注入就是調用者須要的另外一個對象實例不在調用者內部實現,而是經過必定的方式從外部傳入實例,解決了各個類之間的耦合github

通俗一點講:將該對象的實例化交給其調用者,經過某種方式傳入進來,這種模式就是依賴注入。常見的下降耦合的方式:bash

  • 構造方法注入。
  • Setter方式注入。
  • 接口注入。

2、Why Dagger2

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

參考文章


Dagger 詳解

這就是Dagger2

Dagger2 入門實踐

最簡單的Dagger2入門教程

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

相關文章
相關標籤/搜索