定Dagger2的基本介紹:
dagger2是一個依賴注入框架,在編譯期間自動生成代碼,負責依賴對象的創建。
使用Dagger2的好處:
爲了進一步解耦和方便測試,我們會使用依賴注入的方式構建對象 (不使用 new 來創建依賴對象)。在mvp中,presenter層會持有view和model層的依賴,依賴注入主要用於解耦,通過依賴注入創建對象,不再使用new來創建對象。
Dagger的常用註解:
@Inject
1.構造器注入(有多個構造器,只能標註其中一個)
2.屬性注入(被注入的屬性不能用private修飾)
3.方法注入(依賴需要this對象的時刻可以提供安全的this對象)
@Component
兩種定義方法:
void inject(目標類obj)
Dagger2會從目標類開始查找@Inject註解,自動生成依賴注入的代碼,調用inject可完成依賴的注入。
Object getObj();
這種方式一般爲其他Component提供依賴。
@Module
@Provodes
@Qualifier和@Named
@Qualifier是限定符,而@Named則是基於String的限定符
當我有兩個相同的依賴(都繼承某一個父類或者都是先某一個接口)可以提供給高層時,那麼程序就不知道我們到底要提供哪一個依賴,因爲它找到了兩個。
這時候我們就可以通過限定符爲兩個依賴分別打上標記,指定提供某個依賴。
@Qualifier不是直接註解在屬性上的,而是用來自定義註解的。
不論是@Qualifier還是@Named必須成對出現,否則報錯。
@PerActivity
限定對象的生命週期和Activity一樣。一般應用於自定義的Component上。
@Singleton
標記爲單例模式,如果在自定義Module中使用了此註解,在自定義的Component上也要使用該註解。
一個簡單的DaggerDemo
compileOnly 'org.glassfish:javax.annotation:10.0-b28'
implementation 'com.google.dagger:dagger:2.12'
annotationProcessor 'com.google.dagger:dagger-compiler:2.12'
首先創建一個實體類User:
public class User {
public String name;
public User(){
}
public User(String name){
this.name = name;
}
}
然後創建android MVP模式中的presenter:DaggerPresenter
public class DaggerPresenter {
DaggerActivity activity;
User user;
public DaggerPresenter(DaggerActivity activity,User user){
this.user = user;
this.activity = activity;
}
public void showUserName(){
activity.showUserName(user.name);
}
}
創建ActivityModule類
@Module
public class ActivityModule {
private DaggerActivity activity;
public ActivityModule(DaggerActivity activity){
this.activity = activity;
}
@Provides
public DaggerActivity provideActivity(){
return activity;
}
@Provides
public User provideUser(){
return new User("user from ActivityModule");
}
@Provides
public DaggerPresenter provideDaggerPresenter(DaggerActivity activity,User user){
return new DaggerPresenter(activity,user);
}
}
最後創建DaggerActivity
public class DaggerActivity extends AppCompatActivity {
private static final String TAG ="DaggerActivity";
TextView text;
@Inject
DaggerPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = (TextView)findViewById(R.id.text);
inject();
presenter.showUserName();
}
private void inject(){
DaggerActivityComponent.builder().activityModule(new ActivityModule(this)).build().inject(this);
}
public void showUserName(String name){
text.setText(name);
}
}
然後佈局文件就是一個TextView,運行成功後界面會顯示user from ActivityModule.
以上就是我在最近學習中對Dagger2的入門淺析,如有不足希望指教