上一節的最後,我講到一次注入生成類實例的生成步驟。先來回顧一下: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方式: