gpt4 book ai didi

java - 在注入(inject)类中注入(inject)一个接口(interface)的不同实现

转载 作者:行者123 更新时间:2023-12-02 04:21:39 24 4
gpt4 key购买 nike

假设我有一个名为VehicleBikeCar 的接口(interface)的两个实现。我还有一个名为 TireStore 的类。我还有另外两个类,我们将它们命名为 PersonAPersonB。我想做的是,每当我在 PersonA 中使用 TireStore 时,我都希望注入(inject) Car。每当我使用 PersonB 时,我都希望将 Bike 作为 Vehicle 注入(inject)到 TireStore。不知道有没有可能...

到目前为止,我已经尝试使用@Qualifier("exampleQualifier") 注释PersonA 以及使用相同的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{
...
}

最佳答案

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

接口(interface):

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 您想要 Autowiring 哪个 Bean(正在使用 Vehicle 接口(interface))。这就是您可以使用 @Qualfier 注释至少部分解决问题的方法。

但是如何完全解决您的问题的答案是为每个服务创建单独的接口(interface)。这就是您如何避免使用被视为不良做法

胖接口(interface)

我会这样做:对于 Bike 类,我将创建一个 BikeService 接口(interface)并将 Bike 类重命名为 BikeServiceImpl。这同样适用于 Car 类。

我会在您的 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 类连接到您的 PersonAPersonB bean 中,您可以这样做:

@Component
public class PersonA{

private TireStore TireStore;

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

...
}

通过这种方式,您可以将 TireStore bean 注入(inject)到 PersonAPersonB 中。 bean 最好的方法是为 TireStore bean 创建一个接口(interface),而不是在 PersonA bean 中通过其接口(interface) Autowiring TireStore bean,如下所示:

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

并像这样编辑您的TireStorebean

@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 Autowiring 到您的 PersonAPersonB 类中:对于 PersonA bean:

@Component
public class PersonA{

private TireStoreService tireStoreService;

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

...
}

PersonB bean 也是如此

附言避免使用空接口(interface)。如果您想使用有意义的接口(interface)连接您的服务/bean,您可以这样做,这是一个很好的做法。但是如果你没有任何接口(interface)可以使用,我建议你做一个经典的基于构造函数的依赖注入(inject)

希望对您有所帮助。但如果我的回答太困惑或不好,请发表评论,我会折射我的回答

关于java - 在注入(inject)类中注入(inject)一个接口(interface)的不同实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59374415/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com