dagger2系列之生成類實例

  上一節的最後,我講到一次注入生成類實例的生成步驟。先來回顧一下:ide

    1  Module中存在建立方法,則看此建立方法有沒有參數函數

      若是有參數,這些參數也是由Component提供的,返回步驟1逐一輩子成參數類實例,最後再生成最終類實例--okui

      若是無參數,則直接由這個方法生成最終類實例this

   2    Module中沒有建立方法,則從構造函數裏面找那個用@Inject註解的構造函數spa

      若是該構造函數有參數,則也是返回到步驟1逐一輩子成參數類實例,最後調用該構造函數生成類實例code

      若是該構造函數無參數,則直接調用該構造函數生成類實例blog

  本節就是驗證這些步驟是否可行!!!無參數在上一節中已經介紹過了,因此此處驗證都是帶參數的get

 

<一>Module中存在建立方法,有參數it

    按照上面的步驟,它會先看Component提供的Module有沒有提供這個參數,沒有的話找這個參數實體類的構造函數生成實例(@inject)。class

    1  被依賴類和參數的實體類都是由Module建立

NeedProvide3實例

public class NeedProvide3 {

    public NeedProvide3(Bean3 bean){
    }

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

}

  注意這裏的構造器沒有用@inject註解修飾,由於這個類的實例要由Module提供。

參數Bean3

public class Bean3 {
    public Bean3(){
        Log.d("Dagger.class","-------bean3");
    }
}

  注意這裏的構造器沒有用@inject註解修飾,由於這個類的實例要由Module提供。

提供NeedProvide3實例

@Module
public class ProvideModule31 {

    @Provides
   public NeedProvide3 provideNeedProvide(Bean3 bean){
        return  new NeedProvide3(bean);
   }

}

提供參數Bean3

@Module
public class ProvideModule32 {

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

}

橋樑Component

@Component(modules={ProvideModule31.class, ProvideModule32.class})
public interface NeedComponent3 {
    void inject(TargetActivity3 activity);
    Bean3 getBean();//方法名字隨意
}

  這裏須要提供一個方法,當尋找參數的時候會用到,不寫會報錯!!!

目標類

public class TargetActivity3 extends AppCompatActivity {

    @Inject
    NeedProvide3 mNeedProvide3;

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

        DaggerNeedComponent3.builder().build().inject(this);
        Log.d("Dagger.class","qian----");
        mNeedProvide3.printMethod();
        Log.d("Dagger.class","--------hou");

    }
}

  運行看下打印結果:

  

  2  被依賴類的參數由Module提供,參數由@inject方式建立

這裏只有兩個類須要改動,這裏只貼出這兩個類的代碼:

參數類:用@inject註解修飾

public class Bean3 {
    @Inject
    public Bean3(){
        Log.d("Dagger.class","-------bean3");
    }
}

橋樑Component:刪掉了提供Bean3的Module,讓Bean3實例由@inject註解建立

@Component(modules={ProvideModule31.class})
public interface NeedComponent3 {
    void inject(TargetActivity3 activity);
}

  運行的打印結果和上面的是同樣的,說明這兩種方法均可以的!!!

 

<二>Module中不建立方法,有參數

  1  Module中提供參數,被依賴類經過構造器的@inject方式建立

被依賴類:經過@inject方式建立實例

public class NeedProvide4 {
    @Inject
    public NeedProvide4(Bean4 bean){
    }

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

參數Bean4:無@inject註解

public class Bean4 {
    public Bean4(){
        Log.d("Dagger.class","-------bean");
    }
}

提供參數:

@Module
public class ProvideModule4 {

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

}

橋樑Component

@Component(modules = ProvideModule4.class)
public interface NeedComponent4 {
    void inject(TargetActivity4 activity);
}

  運行打印的結果爲:

 

2  被依賴類和參數的實體類都由@inject方式建立

橋樑Component

@Component
public interface NeedComponent4 {
    void inject(TargetActivity4 activity);
}

  被依賴類和參數都須要在構造器上使用@inject註解修飾。此處就不貼代碼了,運行以後的打印結果和上面的同樣。

 

  本篇主要驗證開頭所講的步驟中涉及到的那幾種方法是否行的通。最後總結以下:

    1  參數和被依賴類的實例化有兩種方法,Module和@inject方式。

    2  當建立依賴類須要參數的時候,參數的實例化有兩種方法

        1>Module提供:

          若是依賴類和參數都是Module提供(不禁同一個Module提供),那麼須要在Component中聲明一個方法顯示提供,方法名字任意。

        2>@inject方式:

相關文章
相關標籤/搜索