這篇不同于初體驗教你如何使用况脆,和一些基本的原理。本篇主要講訴Dagger在面對某些復(fù)雜場景的下的擴展。
場景:多構(gòu)造函數(shù)
如果ClassA有兩個不一樣的參數(shù)的構(gòu)造函數(shù)剪况,那么我們在MainActicity界面要有兩個ClassA對象注入货抄,那怎么區(qū)分述召?
先把代碼貼出來
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(“”)限定符來區(qū)分,相信也是很容易理解
@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構(gòu)造函數(shù)上沒有加@inject蟹地,這又更加印證了@inject和module類积暖,只要有一個能提供component所需要的參數(shù)就可以了。(優(yōu)先查看module是否提供)
還有使用@Qualifier限定符命名自定義注解也可以區(qū)分怪与,和@named相比夺刑,后者簡單,只支持String分别,不過足矣遍愿。