是否可以在 Spring boot 中使用多个实现对通用 bean 进行构造函数自动装配?

问题描述 投票:0回答:1

在我当前的项目中,我们有一项具有通用预处理逻辑的服务,该服务在将通用实体传递到目标服务之前对其进行处理,现在当前的实现正在滥用泛型并在 SonarQube 中创建多个代码质量警告,因此我尝试如果可能的话,重构它以正确使用泛型。我现在面临一个问题,Spring 无法创建主类,因为多个 bean 满足要求。

到目前为止我已经做到了这一点:

public class IceCreamService implements OrderService<IcecreamOrder, IcecreamOrderDto> { ... }
public class BurgerService implements OrderService<BurgerOrder, BurgerOrderDto> { ... }
public class PizzaService implements OrderService<PizzaOrder, PizzaOrderDto> { ... }

其中泛型参数分别扩展基类

Order
OrderDto
类,而
OrderService
是定义所有支持方法的签名的接口。

然后我们有一个以下形式的泛型类:

public class OrderOperation<T extends Order, U extends OrderDto> {
    private final OrderService<T, U> targetService;
    ...
}

这个

OrderOperation
类是自动连接到所有在
Order
OrderDto
类上工作的控制器的。

现在我遇到的障碍是 Spring 抱怨存在多个 Bean,在尝试自动装配时满足依赖关系

OrderOperation

我尝试设置

@Scope(value = "prototype")
,但并没有真正起作用。

我应该在这里尝试什么?我考虑过将操作顺序从

generic service -> target service
反转为
target service -> generic service
,但这需要对代码库进行重大更改,因此如果可能的话,最好保留当前的结构。

java spring spring-boot generics
1个回答
0
投票

您可以向 Spring 提供 OrderService 的具体实现来注入到 OrderOperation 中。您可以将 @Qualifier 注释与 bean 名称一起使用。

您可以修改您的 OrderOperation 类:

public class OrderOperation<T extends Order, U extends OrderDto> {
    private final OrderService<T, U> targetService;

    public OrderOperation(@Qualifier("iceCreamService") OrderService<T, U> targetService) {
        this.targetService = targetService;
    }

}

您需要确保 OrderService 的每个实现都使用唯一的 bean 名称正确注释:

@Service("iceCreamService")
public class IceCreamService implements OrderService<IcecreamOrder, IcecreamOrderDto> {
    
}

@Service("burgerService")
public class BurgerService implements OrderService<BurgerOrder, BurgerOrderDto> {
   
}

@Service("pizzaService")
public class PizzaService implements OrderService<PizzaOrder, PizzaOrderDto> {
    
}

通过这些更改,Spring 将根据 @Qualifier 注解准确地知道将哪个 bean 注入到 OrderOperation 中。

© www.soinside.com 2019 - 2024. All rights reserved.