这篇不同于初体验教你如何使用,和一些基本的原理。本篇主要讲诉Dagger在面对某些复杂场景的下的扩展。
场景:多构造函数
如果ClassA有两个不一样的参数的构造函数,那么我们在MainActicity界面要有两个ClassA对象注入,那怎么区分?
先把代码贴出来
public class ClassA {
public int num;
public String s;
public ClassA(int num) {
this.num = num;
}
public ClassA(String s) {
this.s = s;
}
}
public class MainActivity extends AppCompatActivity {
@Named("String")
@Inject
ClassA sa;
@Named("Int")
@Inject
ClassA ia;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerMainComponent.create().inject(this);
Log.e("yjm",sa.s+""+sa.num);
Log.e("yjm",ia.s+""+sa.num);
}
}
做法就是加个@named(“”)限定符来区分,相信也是很容易理解
@Module
public class MainModule {
@Named("Int")
@Provides
public ClassA providerIntA(int num){
return new ClassA(num);
}
@Named("String")
@Provides
public ClassA providerStringA(String s){
return new ClassA(s);
}
@Provides
String providerString(){
return "i m string";
}
@Provides
Integer providerInt(){
return 1;
}
}
@Component(modules = MainModule.class)
public interface MainComponent {
void inject(MainActivity activity);
}
这里我们可以看到ClassA构造函数上没有加@inject,这又更加印证了@inject和module类,只要有一个能提供component所需要的参数就可以了。(优先查看module是否提供)
还有使用@Qualifier限定符命名自定义注解也可以区分,和@named相比,后者简单,只支持String,不过足矣。