gpt4 book ai didi

java - Dagger2 自定义@Qualifier 用法

转载 作者:搜寻专家 更新时间:2023-10-30 21:30:25 28 4
gpt4 key购买 nike

假设我正在造一辆汽车,我有几个具有不同实现的 Brake bean

class Car {
@Inject
Car(@BrakeType(value="abs")Brake frontBrake, @BrakeType(value="nonabs")Brake rearBrake) { }
}

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface BrakeType {
String value();
}

interface Brake {}

@BrakeType(value="abs")
class AbsBrakeImpl implements Brake {
@Inject AbsBrakeImpl() {}
}

@BrakeType(value="nonabs")
class BrakeImpl implements Brake {
@Inject BrakeImpl() {}
}

为什么我的 CarModule 必须为特定的制动器类型定义 @Provides?自定义注释类型@BrakeType 不应该足以确定要注入(inject)哪个 impl 吗?还是需要使用 dagger2 不使用的反射?

@Module
public class CarModule {
@Provides @BrakeType("abs")
public Brake absBrake() {
return new AbsBrakeImpl();
}
@Provides @BrakeType("nonabs")
public Brake nonabsBrake() {
return new BrakeImpl();
}
}

最佳答案

Dagger 不会查看类上的限定符注解,只会查看 @Provides@Binds 方法。所以你的类上的 @BrakeType(value="abs") 注释没有任何效果。

编写代码的更规范的方式是:

class AbsBrakeImpl implements Brake {
@Inject AbsBrakeImpl() {}
}

class BrakeImpl implements Brake {
@Inject BrakeImpl() {}
}

@Module
abstract class CarModule {
@Binds @BrakeType("abs")
abstract Brake absBrake(AbsBrakeImpl impl);

@Binds @BrakeType("nonabs")
abstract Brake nonabsBrake(BrakeImpl impl);
}

请注意,由于您在实现的构造函数上使用了 @Inject,因此您可以简单地使用 Dagger 的 @Bind 将实现直接绑定(bind)到适当限定的接口(interface)。

关于java - Dagger2 自定义@Qualifier 用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35829544/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com