Android Dagger 2 初學筆記
前言
看了大部分的 Dagger 2 教程博客,大多都說的幾點功能:
- 模塊間解耦,提高代碼的健壯性和可維護性
- 訪問全局對象的實例方式更簡單
- 方便進行測試
- 方便管理作用域
由於初學Android,對解耦、測試、作用域瞭解不是很深入,目前並沒有用到相關內容,所以現在只瞭解清楚了它實例化對象的過程
本文就筆者實現基本的Dagger 2 依賴注入功能做一些記錄
日後若有用到其他強大功能,再做記錄說明(肯定會用到其他功能的)
直接結合MVP框架進行示例
簡介
依賴注入 ( Dependency Injection簡稱 di ) 不做說明
在這裏我將用框架實現Presenter
類在Activity
中的實例化
MVP初學筆記中的實現方法:
mPresenter = new MyPresenter(this);
這裏引入一張圖
(先拋開 Application 不講)
由三部分組成:Module + Component + Activity
Module
負責實例化Presenter
類(@Provides
)
構造函數在Activity
中傳參
將自身提供給Component
Component
規定作用域
依賴Module
定義注入方法,參數爲目標類
Activity
定義Presenter
時加一個@Inject
註解
通過DaggerXXComponent.builder().Module()
完成對Module
的構造
通過DaggerXXComponent.inject(this)
完成注入
則Presenter
被實例化
看起來比原來的new方法來的複雜的多呀。。。
還有一些註解的使用在下文簡單說明
示例
實例化
MyModule
@Module
public class MyModule {
private Context mContext;
/**
* 構建MyModule時,將Context傳進來
* @param mContext 這裏指MyActivity
*/
public MyModule(Context mContext) {
this.mContext=mContext;
}
@Singleton
@Provides
MyPresenter providerMyPresenter(){
return new MyPresenter(mContext);
}
}
Module類一定要有@Module
註解
返回實例化的方法上要有@Provides
註解,方法名一般爲provideXXPresenter()
@Singleton
的理解還不夠清晰,日後再做解釋
添加依賴
MyComponent
@Singleton
@Component(modules = MyModule.class)
public interface MyComponent {
void inject(MyActivity activity);
}
Component類一定要有@Component
註解,並且參數 modules 設置爲要添加的Module類
這裏定義注入方法(一般爲)inject
,參數爲Activity類
下面要做的就是在Activity類中調用這個方法實現注入(實例化)
注入
MyActivity
public class MyActivity extends AppCompatActivity implements MyView{
ImageView helloIv;
@Inject
MyPresenter mPresenter;//在MyModule中provide的實例
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
helloIv=findViewById(R.id.iv_helloimg);
//Dagger注入 實例化
DaggerMyComponent.builder()
.myModule(new MyModule(this))
.build()
.inject(this);
mPresenter.onCreate();
mPresenter.attachView(this);//綁定View並且實現方法
//mPresenter.getImage();
//TODO
}
在要實例化的類 定義時添加註解@Inject
完成之前的
Module
以及Component
的創建後,build操作一下,框架會自動生成一個DaggerXXXComponent
類(這裏是DaggerMyComponent
)
對Module類進行傳參構造(參數實際上爲
Presenter
服務).builder().myModule(new MyModule(this)).build()
實現注入(調用
inject()
方法).inject(this)
到這裏就算是完成了整個過程,之後就可以直接使用@Inject
註解定義的實體(Presenter
)了
總結
這裏只是一種比較基礎(小白)的 Dagger 2 實現的方式
觀察Google官方代碼的話,應該有更具體(牛逼)的方式實現
一般Dagger 2與MVP結合使用
(Google的Demo是真的很到位)
Google Android MVP + Dagger 2 Demo
學習過程中看過的博客:
- Google官方MVP + Dagger2架構講解
- Android快速依賴注入框架Dagger2使用1 這個博主有很多Android相關文章,都還不錯
好像還有一個Dagger 2應用於Android的完美擴展庫dagger.android,日後再研究