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的用法
新闻热点
疑难解答