目錄:andorid jar/庫源碼解析 Dagger、Dagger2: 作用: 1、用於解耦Activity和業務邏輯 2、在使用業務的時候,不需要重覆編寫new代碼。 3、當業務變化的時候,不需要對所有的UI,進行修改。 4、便於測試,和正式,替換指定Module即可。 慄子: 需要: 1、定義 ...
Dagger、Dagger2:
作用:
1、用於解耦Activity和業務邏輯
2、在使用業務的時候,不需要重覆編寫new代碼。
3、當業務變化的時候,不需要對所有的UI,進行修改。
4、便於測試,和正式,替換指定Module即可。
慄子:
需要:
1、定義 CommonComponent 的介面 標記 @Component(modules = XXXModule.class) 的註解
2、定義XXXModule 模塊,並標註 @Module 的註解 ,對添加的方法使用 provide開頭,這些 provide方法需要添加 @Provides註解
A業務類:
構造函數使用 @Inject 註解
B頁面:
1、定義A業務類的變數,使用@Inject註解
2、在OnCreate中,使用如下代碼進行初始調用
DaggerCommonComponent.builder().commonModule(new CommonModule(this)).build().inject(this);
3、DaggerCommonComponent由,使用Dagger自動生成的類(Dagger使用APT技術實現),使用apt生成如下代碼
編譯之後查看APK是下麵這樣(紅色部分為自動生成)
4、然後就可以使用了。。。。
源碼解讀:
①:創建一個 DaggerCommonComponent$Builder對象,用於接收 CommonModule 和返回 CommonComponent的介面對象
②:創建一個 CommonModule對象,參數是當前對象,並且賦值CommonModule對象給 DaggerCommonComponent$Builder對象的成員
③:檢查 CommonModule對象,並且返回一個 DaggerCommonComponent對象。且該對象創建了一個Prodiver對象。且賦值為 新增類 CommonModule_ProvideIcommonViewFactory 繼承於Factory(Factory extends Provider),且包含成員CommonModule
④:調用DaggerCommonComponent對象的inject並傳入當前對象,創建一個 LoginPresenter 對象,並且賦值給this對象的presenter對象(該對象標記過Inject)
源碼:https://github.com/square/dagger (Dagger) https://github.com/google/dagger (Dagger2)
引入:
// dagger2 implementation 'com.google.dagger:dagger:2.23.1' annotationProcessor 'com.google.dagger:dagger-compiler:2.23.1'