假设我正在制造一辆汽车,并且我有几个具有不同实现的 Brake beans
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 不应该足以确定要注入哪个 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
or @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
将实现直接绑定到适当的限定接口。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)