在注入的类中注入一个接口的不同实现

时间:2019-12-17 12:37:21

标签: java spring dependency-injection

因此,可以说我有两种实现,分别是名为VehicleBikeCar的接口。我还有另一个班级,名为TireStore。我还有另外两个类,让它们分别命名为PersonAPersonB。我想做的是,每当我在TireStore中使用PersonA时,我都希望注入Car。每当我使用PersonB时,我都希望将Bike作为Vehicle注入到TireStore中。我不知道是否有可能...

到目前为止,我已经尝试用PersonA@Qualifier("exampleQualifier")来注释Car。然后我将Bike注释为@Primary

没用。搜索了一下,没有找到任何解决方案。

谢谢。

它们的结构如下:

@Component
public class PersonA{

    private TireStore TireStore;

    public TireStore(TireStore tireStore){
        this.tireStore = tireStore;
    }
    ...
}
@Component
public class PersonB{

    private TireStore tireStore;

    public TireStore(TireStore tireStore){
        this.tireStore = tireStore;
    }
    ...
}
@Component
public class TireStore{

    private Vehicle vehicle;

    public TireStore(Vehicle vehicle){
        this.vehicle = vehicle;
    }
    ...
}
@Component
public class Bike extends Vehicle{
...
}
@Component
public class Car extends Vehicle{
...
}

1 个答案:

答案 0 :(得分:0)

我认为处理此类问题时首先想到的是重新考虑应用程序的体系结构。因为使用 @Qualifier 注释将解决在多个Bean中连接相同接口的最初问题。但是,根据您的示例,如果没有紧密耦合的代码,很难将此类连接到您的 PersonA PersonB 类。 我将向您展示我的示例:

接口

public interface Vehicle(){
  //some methods you are using in this interface

}

自行车课:

@Component
public class Bike implements Vehicle{
  //here are the implemented methods from Vehicle Interface
}

汽车类别:

@Component
public class Car implements Vehicle{
  //here are the implemented methods from Vehicle Interface
}

轮胎商店类别:

@Component
public class TireStore{

    private Vehicle vehicle;

    public TireStore(@Qualifier("bike") Vehicle vehicle){
      this.vehicle = vehicle;
    }
}

@Qualifier 批注括号内的String是Bean的名称。基本上,您是专门告诉Spring您想要自动装配哪个Bean(谁正在使用Vehicle接口)。 这是您可以使用 @Qualfier 注释至少部分解决问题的方法。

但是如何完全解决问题的答案是为每个服务创建单独的接口。这样可以避免使用胖界面(被认为是 不良习惯

我会这样: 对于 Bike 类,我将创建一个 BikeService 接口,并将Bike类重命名为 BikeServiceImpl >。 同样适用于汽车课。

比起我将在您的 TireStore 类中实现这两项服务

@Component
public class TireStore{

  private final BikeService bikeServices;
  private final CarService carServices;

  public TireStore(BikeService bikeService, CarService carService){
    this.bikeService = bikeService;
    this.carService = carService;
  }

  // here are your methods 

}

现在,如果您要将这个 TireStore 类连接到您的 PersonA PersonB Bean中,您可以这样做:

@Component
public class PersonA{

  private TireStore TireStore;

  public TireStore(TireStore tireStore){
    this.tireStore = tireStore;
  }

  ...
}

通过这种方式,您可以将TireStore bean注入到 PersonA PersonB 中。 bean最佳方法是为TireStore bean创建一个接口,然后在 PersonA bean中通过其接口自动连接TireStore bean,如下所示:

public interface TireStoreService(){
  //some methods or empty
}

并像这样编辑 TireStore

@Component
public class TireStore implements TireStoreService{

  private final BikeService bikeServices;
  private final CarService carServices;

  public TireStore(BikeService bikeService, CarService carService){
    this.bikeService = bikeService;
    this.carService = carService;
  }

  // here are your methods 

}

现在,您可以像下面这样将这个TireService bean自动连接到您的 PersonA PersonB 类中: 对于 PersonA 豆:

@Component
public class PersonA{

  private TireStoreService tireStoreService;

  public TireStore(TireStoreService tireStoreService){
    this.tireStoreService = tireStoreService;
  }

  ...
}

PersonB bean

P.S。避免使用 空接口 。如果要使用有意义的接口连接服务/ bean,则可以这样做,这是一个好习惯。但是,如果您没有任何接口可以使用,我建议您进行经典的 基于构造函数的依赖注入

希望这会对您有所帮助。但是,如果我的回答过于混乱或糟糕,请发表评论,我会拒绝我的回答