Dagger2学习笔记之Qualifier

本文介绍Dagger2中Qualifier的使用方法,通过实例演示如何解决依赖注入时对象相同但来源不同的问题。采用Qualifier注解区分不同来源的对象,确保正确注入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值