首页 > 学院 > 开发设计 > 正文

Dagger2学习笔记之Qualifier

2019-11-09 14:44:59
字体:
来源:转载
供稿:网友

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的用法


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表