一、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。