android studio Dagger2的使用(環境搭建和helloword)

Dagger2是一款使用在Java和Android上的依賴注入的一個類庫,目前Dagger有兩個分支,一個由Square維護,一個爲Google在前者的基礎上開出的分支,即Dagger2

一般情況下,我們創建一個對象的時候都是採用new的形式,這樣就會導致在代碼多起來的時候,你不知道對象在哪裏被創建,Dagger2就是爲了方便管理這些對象。

1 Dagger2環境的搭建:

Dagger2的環境搭建很簡單,在studio的工程的build.gradle下添加:

buildscript {
 ......
 dependencies {
     ......
     classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
 }
}
在module的build.gradle添加:

apply plugin: 'com.neenbedankt.android-apt'
......
dependencies {
 ......
 compile 'com.google.dagger:dagger:2.5'
 apt "com.google.dagger:dagger-compiler:2.5"
 provided 'javax.annotation:javax.annotation-api:1.2'
}
這樣,Dagger2的環境就搭建好了,下面我們來實現Dagger2的使用。

Dagger2的使用:

@Inject註解

該註解用來標記需要自動創建實例的類,哪個類需要初始化,就在哪個類的構造方法前面加上這個註解,然後再到該類的對象的前面也加上這個註解,在這裏,我們創建一個Dagger_data1的類。該類有一成員變量int a=10;重寫該類的構造方法,並在其上面添加@Inject,

@Inject
public Dagger_data1(){

}
MainActivity中聲明Dagger_data1的對象,

@Inject
Dagger_data1 data1;
此時編譯的話,是無法正常運行的,@Inject並不能真正的創建對象,因此,我們還需要一個連接器去把
MainActivity中的對象和Dagger_data1連接起來,那就是@Component

@Component:剛說了Component是一個連接器,他通過查找目標類中用Inject註解標註的對象(本例子的對象在MainActivity中),查找到相應的對象後,接着查找該對象所在的類對應的用Inject標註的構造函數(這時候就發生聯繫了),剩下的工作就是初始化該變量的實例並把實例進行賦值。

創建一個Component1接口,該接口使用@Component註解標記,注意,該接口必須有一個或者更多的方法,而且該方法的命名滿足provision或者members-injection規則,這裏我們使用的是members-injection,
public void inject(MainActivity activity);
注意,該方法傳進來的參數一定要和對象所在的上下文環境對應,本例子的對象是在MainActivity,參數就是
MainActivity,寫到這裏,連接器的方法我們就寫完了,接下來編譯,編譯完成後Dagger2會生成一個類,這個類是我們初始化對象所用到類,該類的命名服從Dagger+連接器名稱的規則,該類源碼如下:
public final class DaggerComponent1 implements Component1 {
  private MembersInjector<MainActivity> mainActivityMembersInjector;

  private DaggerComponent1(Builder builder) {
    assert builder != null;
    initialize(builder);
  }

  public static Builder builder() {
    return new Builder();
  }

  public static Component1 create() {
    return builder().build();
  }

  @SuppressWarnings("unchecked")
  private void initialize(final Builder builder) {

    this.mainActivityMembersInjector =
        MainActivity_MembersInjector.create(Dagger_data1_Factory.create());
  }

  @Override
  public void inject(MainActivity activity) {
    mainActivityMembersInjector.injectMembers(activity);
  }

  public static final class Builder {
    private Builder() {}

    public Component1 build() {
      return new DaggerComponent1(this);
    }
  }
}
這樣,我們就可以通過該類來創建我們需要創建的對象了
DaggerComponent1.builder().build().inject(this);//this在這裏是MainActivity

OK,對象創建完畢,我們直接使用對象裏面的方法就可以data1.getA();
結果出來是10.







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