Dragger2快速入門淺析

定Dagger2的基本介紹:

dagger2是一個依賴注入框架,在編譯期間自動生成代碼,負責依賴對象的創建

使用Dagger2的好處:

爲了進一步解耦和方便測試,我們會使用依賴注入的方式構建對象 (不使用 new 來創建依賴對象)。在mvp中,presenter層會持有view和model層的依賴,依賴注入主要用於解耦通過依賴注入創建對象,不再使用new來創建對象。

Dagger的常用註解:

@Inject

1.構造器注入(有多個構造器,只能標註其中一個)

2.屬性注入(被注入的屬性不能用private修飾)

3.方法注入(依賴需要this對象的時刻可以提供安全的this對象)

@Component

Dagger2是通過component來完成依賴注入的,一般定義component通常使用接口定義,用@Component註解。
兩種定義方法:

void inject(目標類obj)

Dagger2會從目標類開始查找@Inject註解,自動生成依賴注入的代碼,調用inject可完成依賴的注入。

Object getObj();

這種方式一般爲其他Component提供依賴。

@Module

@module標記在類的上面
在@Component中指定Module(@Component = obj.class)
具體來說:此註解裏面全是方法,用於對外提供對象,自己定義方法,方法上使用@Provides。自定義一個類,以Module結尾,用@Module註解。

@Provodes

@Provodes標記在方法的上面

@Qualifier和@Named

@Qualifier是限定符,而@Named則是基於String的限定符

當我有兩個相同的依賴(都繼承某一個父類或者都是先某一個接口)可以提供給高層時,那麼程序就不知道我們到底要提供哪一個依賴,因爲它找到了兩個。
這時候我們就可以通過限定符爲兩個依賴分別打上標記,指定提供某個依賴。

@Qualifier不是直接註解在屬性上的,而是用來自定義註解的。

不論是@Qualifier還是@Named必須成對出現,否則報錯。

@PerActivity

限定對象的生命週期和Activity一樣。一般應用於自定義的Component上。

@Singleton

標記爲單例模式,如果在自定義Module中使用了此註解,在自定義的Component上也要使用該註解。

一個簡單的DaggerDemo

我用的android studio的版本是3.13版本。
build.app(Module:app)的配置:
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的入門淺析,如有不足希望指教





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