dagger2在使用中,會出現兩個方法返回對象相同時的情況,那么如何區分呢。
由Dagger2學習筆記之dependencies更改的demo
public class PResent { String ss = "呵呵噠"; public Present(Context context) { } public Present(String name) { this.ss = name; }}@Modulepublic class AppModule { Context mContext; public AppModule(Context context) { this.mContext = context; } @Provides public Context provicesContext(){ return mContext; } @Provides public String provicesString(){ return "盲僧"; }}@Component(modules = {AppModule.class})public interface AppComponent { //暴露一個接口 Context proContext(); //暴露一個接口 String proString();}@Modulepublic class ActivityModule { @Named("context") @Provides Present providesPresent(Context context){ return new Present(context); } @Named("string") @Provides Present providesPresentName(String name){ return new Present("女警"); }}@Component(dependencies = {AppComponent.class},modules = {ActivityModule.class})public interface ActivityComponent { void injectActivity(Main3Activity activity);}public class Main3Activity extends AppCompatActivity { @Named("context") @Inject Present mPresent; @Named("string") @Inject Present mPresent2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main3); AppComponent appComponent = DaggerAppComponent.builder().appModule(new AppModule(this)).build(); ActivityComponent activityComponent = DaggerActivityComponent.builder() .appComponent(appComponent) .activityModule(new ActivityModule()) .build(); activityComponent.injectActivity(this); Log.e("",mPresent.ss+" "+mPresent2.ss); }}打印結果為:呵呵噠 女警注意點:
1:Main3Activity中的屬性必須用@Named("xxx")進行標注
2:ActivityModule中也需要@Named("xxx")進行標注
可以看出來,我們在用@Named時,很容易把括號里面的內容填寫錯誤,這時Qualifiler(限定符,自定義標記)的作用
創建兩個注解
@Qualifier@Retention(RetentionPolicy.RUNTIME) // 運行時仍可用public @interface PresentForContext {}@Qualifier@Retention(RetentionPolicy.RUNTIME) // 運行時仍可用public @interface PresentForName {}再把上面demo中的@Named("xx")替換掉就行
@Modulepublic class ActivityModule { @PresentForContext @Provides Present providesPresent(Context context){ return new Present(context); } @PresentForName @Provides Present providesPresentName(String name){ return new Present(name); }}public class Main3Activity extends AppCompatActivity { @PresentForContext @Inject Present mPresent; @PresentForName @Inject Present mPresent2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main3); AppComponent appComponent = DaggerAppComponent.builder().appModule(new AppModule(this)).build(); ActivityComponent activityComponent = DaggerActivityComponent.builder() .appComponent(appComponent) .activityModule(new ActivityModule()) .build(); activityComponent.injectActivity(this); Log.e("",mPresent.ss+" "+mPresent2.ss); }}這就是Qualifiter的用法
新聞熱點
疑難解答