Dagger之拓展多构造函数

这篇不同于初体验教你如何使用,和一些基本的原理。本篇主要讲诉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,不过足矣。

你可能感兴趣的:(Dagger之拓展多构造函数)