注射遗产和CDI

时间:2017-07-08 14:25:43

标签: cdi

我对遗产和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

我该怎么做?

2 个答案:

答案 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有资格注射,你需要通过使用限定符或注入更具体的接口/类来缩小选择范围。