我对遗产和CDI有疑问。 给出两个接口:
延伸汽车的SportCar
interface Car {
}
interface SportCar extends Car{
}
class DefaultCar implements Car {
}
@FerrariQualifier
class DefaultSportCar implements SportCar {
}
我想注入的内容:
@Inject
private Car car; //inject DefaultCar
@Inject
@FerrariQualifier
private Car ferrari; //inject DefaultSportCar
@Inject
private SportCar sportCar;//inject DefaultSportCar
我该怎么做?
答案 0 :(得分:3)
如果没有任何进一步的示例或解释,您需要使用限定符@Default注入第一个。
这显然需要任何进一步的'Car'附加一个非@ Default限定符,否则你有一个模棱两可的分辨率而你正试图将一些东西塞进CDI中而不适合。
答案 1 :(得分:1)
我认为你误解了CDI注射。特别是你想要这样做:
@Inject
private Car car; //inject DefaultCar
因为任何汽车实施(跑车或普通汽车)都适合这里,你最终会得到模棱两可的解决方案。
作为一种临时解决方案,您可以使用用户 covener 所指出的@Default
限定符,但只要您引入任何其他没有限定符的汽车实施,这肯定会中断。
最干净的解决方案可能是重新思考设计并改变层次结构,如下所示:
interface Car {
// all cars, place common methods here
}
interface SportCar extends Car{
// interface for all sport cars
}
interface ClassicCar extends Car{
// interface for all non-sport cars
// this is what you will inject
}
class DefaultCar implements ClassicCar {
}
@FerrariQualifier
class DefaultSportCar implements SportCar {
}
这样你就可以:
@Inject
private ClassicCar car;
获取DefaultCar
的实例。其余的注射也会以同样的方式运作。
另一种解决方案是使用限定符。
一般来说 - 每当你遇到模糊的解决方案时,你就有多个bean有资格注射,你需要通过使用限定符或注入更具体的接口/类来缩小选择范围。