Dagger2系列之使用方法

  本系列只講使用方法和使用中遇到的問題,若是還對dagger2還不瞭解的童鞋兒能夠參考文章:java

                      http://www.jianshu.com/p/cd2c1c9f68d4android

                      http://www.jianshu.com/p/94d47da32656app

  使用Dagger2的前提須要添加一些依賴:ide

    1  在Project的 build.gradle文件添加如下內容函數

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
         classpath 'com.android.tools.build:gradle:2.1.0'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4' } }

   2  在Module下的build.gradle添加如下內容 學習

apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'

dependencies {
    apt 'com.google.dagger:dagger-compiler:2.4' compile 'com.google.dagger:dagger:2.4' provided 'org.glassfish:javax.annotation:10.0-b28'
} 

  下面咱們學習一下Dagger2的使用。gradle

 

<一>目標類和被依賴的類,都是咱們直接可修改的。ui

  1  在被依賴類的構造函數上使用@inject註解this

public class NeedProvide {
    @Inject public NeedProvide(){
    }

    public void printMethod(){
        Log.d("Dagger.class","NeedProvide----printMethod()");
    }
}

   2  建立Component,做爲目標類和被依賴類的橋樑,並被@Component註解google

@Component
public interface NeedComponent {
    void inject(TargetActivity activity);
}

  3  運行一下,讓項目生產XXXComponent

  4  在目標類中利用XXXComponent進行依賴注入

DaggerNeedComponent.builder().build().inject(this);

  5  依賴注入完畢後,經過@inject使用被依賴類

public class TargetActivity extends AppCompatActivity {

    @Inject
    NeedProvide mNeedProvide;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        DaggerNeedComponent.builder().build().inject(this);
        mNeedProvide.printMethod();
    }
}

  這裏有三種角色。目標類TargetActivity,被依賴類NeedProvide,橋樑NeedComponent。

  這種方法適用於目標類和被依賴類都是咱們本身建立的時候。在使用第三方庫的時候,沒法直接在類構造函數中添加@Inject註解。或者被依賴類有多個構造函數的時候,不能註解多個構造函數,這樣會產生歧義,由於Dagger2沒法確認調用哪個構造函數,來生成類的實例對象。此時這種方法就失效了,下面請看第二種方法。

 

<二>建立Module提供咱們被依賴類,使用@Provides註解修飾

  這種方法步驟和上面同樣,只不過修改咱們添加一些註解,直接看代碼。

被依賴類:  

public class NeedProvideS {

    public NeedProvideS(){
    }

    public void printMethod(){
        Log.d("Dagger.class","NeedProvideS----printMethod()");
    }

}  

  這裏將NeedProvideS類構造器上的@inject註解去掉了(不去掉也行,此處爲了防止第一種方法對本次影響)。

被依賴類的封裝類即Module:           

@Module
public class ProvideModuleS {

    @Provides public NeedProvideS provideNeedProvide(){
        return  new NeedProvideS();
   }

}

  使用Module封裝被依賴類的目的在以前說過。此處咱們看看這個類,類上用@Module註解修飾,方法是提供被依賴類的,因此用@Provides修飾,目的是爲了讓dagger可以查找到。

@Module
public class ProvideModuleS {

    @Provides
   public NeedProvideS provideNeedProvide(Bean bean){
        return  new NeedProvideS(bean);
   }

    @Provides
    public Bean provideBean(){
        return new Bean();
    }

}

  當咱們某一個方法須要參數的時候,它會自動去查找本類其餘被@Module註解修改的方法。

橋樑:

@Component(modules = ProvideModuleS.class) public interface NeedComponentS {
    void inject(TargetActivityS activity);
}

  此處使用了modules屬性,指定提供封裝了被依賴類的封裝類。Component還能夠依賴多個Module。下篇會講。

目標類:

public class TargetActivityS extends AppCompatActivity {

    @Inject
    NeedProvideS mNeedProvideS;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        DaggerNeedComponentS.builder().build().inject(this);
        mNeedProvideS.printMethod();
    }
}

  上面咱們介紹了dagger2使用的兩種方法,那若是實際狀況中,兩種方法都用,那麼默認會先使用哪一種方法建立實列那?其實在構建類實例的時候,會按照如下順序執行:

從Module中查找類實例建立方法

  1. Module中存在建立方法,則看此建立方法有沒有參數
    1. 若是有參數,這些參數也是由Component提供的,返回步驟1逐一輩子成參數類實例,最後再生成最終類實例
    2. 若是無參數,則直接由這個方法生成最終類實例
  2. Module中沒有建立方法,則從構造函數裏面找那個用@Inject註解的構造函數
    1. 若是該構造函數有參數,則也是返回到步驟1逐一輩子成參數類實例,最後調用該構造函數生成類實例
    2. 若是該構造函數無參數,則直接調用該構造函數生成類實例

  以上就是一次注入生成類實例的生成步驟。(copy others,原文連接:http://www.jianshu.com/p/94d47da32656)

  Dagger2最基本的使用方法已經介紹完畢了,下一遍我會講解我在實際使用的時候遇到的問題。

相關文章
相關標籤/搜索