dagger2在使用中,会出现两个方法返回对象相同时的情况,那么如何区分呢。
由Dagger2学习笔记之dependencies更改的demo
public class Present { String ss = "呵呵哒"; public Present(Context context) { } public Present(String name) { this.ss = name; } }
@Module public 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(); }
@Module public 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")替换掉就行
@Module public 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的用法