因此,可以说我有两种实现,分别是名为Vehicle
,Bike
和Car
的接口。我还有另一个班级,名为TireStore
。我还有另外两个类,让它们分别命名为PersonA
和PersonB
。我想做的是,每当我在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{
...
}
答案 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,则可以这样做,这是一个好习惯。但是,如果您没有任何接口可以使用,我建议您进行经典的 基于构造函数的依赖注入
希望这会对您有所帮助。但是,如果我的回答过于混乱或糟糕,请发表评论,我会拒绝我的回答