Android框架式編程之Dragger2框架

一、Dagger2 框架介紹

Dagger2是Google出的依賴注入框架。該框架是基於Square公司開發的Dagger基礎上開發的。Dagger起初由Square公司開發,後來谷歌對它進行修改及維護。是一款基於Java註解來實現的編譯期生成的依賴注入開源庫,主要用於模塊間解耦,提高代碼的健壯性和可維護性。

Dagger2的原理是在編譯期生成相應的依賴注入代碼。這也是和其他依賴注入框架不同的地方,其他框架是在運行時期反射獲取註解內容,影響了運行效率。

我們爲什麼要使用依賴注入?我們之所以是用是因爲依賴注入最重要的就是解耦,達到高聚合低耦合的目的,保證代碼的健壯性,靈活性,可維護性。

官網地址:https://github.com/google/dagger

二、Dragger2 基本使用

Dragger2 使用的示例代碼在:

https://gitee.com/renhui112115/dragger2-demo

這裏就不多贅述了,下面貼出來一張圖,來幫助我們理解一下使用Dragger2時的代碼結構:

三、Dragger2 原理解析

我們知道通過Dragger2可以完成依賴注入,它使用的是預編譯期間生成的代碼完成依賴,而不是使用反射。(注:反射的大量使用會影響性能)

下面我們從MainActivity使用注入的方法開始分析:

DaggerUserComponent.create().inject(this);
public static UserComponent create() {
    return new Builder().build();
}

下面我們看一下build()方法

public static final class Builder {
    private UserModule userModule;

    private Builder() {}

    public UserComponent build() {
      if (userModule == null) {
        this.userModule = new UserModule();
      }
      return new DaggerUserComponent(this);
    }

    public Builder userModule(UserModule userModule) {
      this.userModule = Preconditions.checkNotNull(userModule);
      return this;
    }
  }

可以看出來Builder持有我們註冊的兩個Module的引用。在build()方法中會實例化Module,然後生成相應的組件。

下面我們看一下 inject 方法,可以看出來編譯完成後,通過註解生成器生成這些方法:

  @Override
  public void inject(MainActivity activity) {
    injectMainActivity(activity);
  }

  private MainActivity injectMainActivity(MainActivity instance) {
    MainActivity_MembersInjector.injectApiService(instance, UserModule_ProvideApiServiceFactory.proxyProvideApiService(userModule));
    return instance;
  }

通過閱讀,編譯自動生成的代碼,我們可以知道,Dragger2通過對我們的註解,自動生成相應的類,完成依賴的注入。

理解Dragger2的關鍵在於理解 註解 及 註解生成器 的工作原理。 

這裏我們建議 理解 ARouter 和 ButterKnife 的核心思想,並進行手寫實現。 這樣能夠幫助我們進一步理解Dragger2。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章