在我当前的项目中,我们有一项具有通用预处理逻辑的服务,该服务在将通用实体传递到目标服务之前对其进行处理,现在当前的实现正在滥用泛型并在 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
,但这需要对代码库进行重大更改,因此如果可能的话,最好保留当前的结构。
您可以向 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 中。