Dagger2在Android studio中的配置與簡單使用

Dagger2環境搭建(android studio):Module:app-->gradle配置(紅色部分)
apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        // the latest version of the android-apt plugin
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
    }
}
android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"
    defaultConfig {
        applicationId "com.test.yqman.mydaggertest"
        minSdkVersion 17
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.2.0'

    compile 'javax.inject:javax.inject:1'
    compile 'javax.annotation:javax.annotation-api:1.2'
    compile 'com.google.dagger:dagger:2.0'
    apt 'com.google.dagger:dagger-compiler:2.0'
    provided 'org.glassfish:javax.annotation:10.0-b28'
}

使用:
Module
@Module
public class SecondModule {
    @Provides MyDataService providerMyDataService_sbdf(){ 
        return new MyDataService();
    }
}

@Module
public class MyModule {
    MainActivity mainActivity;
    public MyModule(MainActivity mainActivity){
        this.mainActivity = mainActivity;
    }
    @Provides MainActivity providerMainActivity_dafwe(){
        return mainActivity;
    }
    @Provides MyData providerMyData_xdsf(){
        return new MyData();
    }
    @Provides MyPresenter MyPresenter(MainActivity mainActivity,MyDataService myDataService){
        return new MyPresenter(mainActivity,myDataService);
    }
}
說明:
  • 這裏使用了兩個註釋@Module 、@Provides;
  • 前者聲明這是個Module類
  • 後者聲明這個方法可以提供什麼對象;重要的是返回值,方法名不重要;當然爲了讓別人看的清楚這個方法返回什麼類型對象;方法名可以採用provider+返回類名的格式;
  • 簡單概述:方法返回值指明提供的依賴類型(重點);方法參數指明將要消耗的依賴對象
  • 注意:
    • 用Provider標註且返回值類型相同的方法只能出現一次!!!
    • 方法中的參數必須在當前componet或者下一級component中的modules中能夠找到一個提供相關對象的方法;
    • 即:
      • MainActivity mainActivity來自於MyModule類中的@Provides MainActivity
      • MyDataService myDataService來自於SecondModule類中的@Provides MyDataService

Component
@Component(modules = {MyModule.class,SecondModule.class})
public interface MyComponent {
    void inject_vsd(MainActivity mainActivity);
    ClientClass inject_asd(ClientClass clientClass);
    MyPresenter providerMyPresent_dfafd();
}

@Component(dependencies = MyComponent.class)
public interface MySecondComponent {
    void inject_faewf(ClientClass clientClass);
}
說明:
  • 這裏使用了註釋@Component(modules = {MyModule.class,SecondModule.class})聲明這是個Component
  • 這個類可以聲明兩種方法:
    • 指明消耗依賴類:
      • 這類方法的格式是void xsajklf(MyClass myclass)或者 MyClass xsajklf(MyClass myclass);
      • 即返回的對象要麼爲void要麼爲消耗依賴類對象自己;
      • 簡單概述:方法返回值隨意,方法參數指明消耗依賴類,方法名隨意只不過建議使用inject命名
    • 返回類實例的對象普通方法:
      • 這類方法格式是ProviderClassA xdasdfas();
      • 這類方法的使用場景主要是當另一個Component使用了dependencies關鍵字時,即@Component(dependencies = MyComponent.class);該Componet給上一層的Component所能提供的依賴類對象;
      • 簡單概述:方法返回值指明提供的依賴類型,方法參數爲空
  • 注意:這裏定義的Component是一個接口

消耗依賴類:
public class MainActivity extends Activity {
    @Inject MyPresenter myPresenter;
    @Inject MyData myDatabase1;
    @Inject MyData  myDatabase2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout);
        if(myPresenter==null) Log.e("test", "presenter is null");
        MyComponent m = DaggerMyComponent.builder().myModule(new MyModule(this)).secondModule(new SecondModule()).build();
        m.inject_vsd(this);

        //證明注入成功
        Log.e("test", "---------dagger test-------------");
        if(myPresenter==null){  Log.e("test", "Dagger failed");  }
        else{   Log.e("test", "Dagger success");  }

        //默認情況注入對象是否單例
        Log.e("test", "---------single test-------------");
        if(myDatabase1==myDatabase2){   Log.e("test", "single model");   }
        else{  Log.e("test", "not single model");  }

        //普通方法返回消耗類
        Log.e("test", "---------simple method test-------------");
        MyPresenter pre = m.providerMyPresent_dfafd();
        if(pre == null){  Log.e("test", "can not return 0bject"); }
        else if(pre==myPresenter) Log.e("test", "single model");
        else Log.e("test", "not single model");
        new ClientClass(m);
    }
}
說明:
  • @Inject MyPresenter myPresenter;
  • @Inject MyData myDatabase1;
  • @Inject MyData myDatabase2;
  • 上面三個域通過 MyComponent m = DaggerMyComponent.builder().myModule(new MyModule(this)).secondModule(new SecondModule()).build();; m.gblihui(this); 注射進來
  • MyPresenter pre = m.providerMyPresent_dfafd();; 只是一個普通的方法調用,底層實現也是調用Module中的相關方法;
  • 注意:使用@Inject進行標註的域,必須是類變量不能是局部變量;而且變量類型必然是能夠在Component或者其底層Component聲明的Module中能夠找到對應擁有該返回值能力的方法;

消耗依賴類調試信息:
presenter is null
---------dagger test-------------
Dagger success
---------single test-------------
not single model
---------simple method test-------------
not single model



reference:


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