java - 泛型的 Spring 嵌套自动装配抛出 NoUniqueBeanDefinitionException
问题描述
是否可以在构造函数中将泛型类型自动装配为不同的泛型类型?我目前有这样的结构:
@Service
public class ExampleService {
@Autowired
ServiceA<Integer> servicea;
}
和服务:
@Component
@Scope(SCOPE_PROTOTYPE)
public class ServiceA<S> {
private final ServiceB<S,String> dependentServiceB;
public ServiceA (ServiceB<S,String> dependentServiceB){
this.dependentServiceB = dependentServiceB;
}
}
@Configuration
public class ServiceBConfig {
@Bean
ServiceB<Integer,String> serviceBwithInt (){
return new ServiceBImplInt();
}
@Bean
ServiceB<Long,String> serviceBwithLong (){
return new ServiceBImplLong();
}
}
现在,如果我尝试在其他地方自动装配 ExampleService 类,它会抛出一个 NoUniqueBeanDefinitionException,其中包含“没有 '....ServiceB< ? >' 类型的合格 bean:预期的单个匹配 bean,但找到了 2:serviceBwithInt,serviceBwithLong”。
这是否可以像这样解决它,还是我必须为每个不同的泛型类型实现 ServiceA 的子类?
解决方案
考虑到类型擦除的工作原理,这两个 bean 都可以被注入,因为Java会接受这两个作为构造函数的有效参数。
如果您想明确说明注入的内容,请使用@Qualifier
.
@Component
@Scope(SCOPE_PROTOTYPE)
public class ServiceA<S> {
private final ServiceB<S,String> dependentServiceB;
public ServiceA (@Qualifier("serviceBWithInt")ServiceB<S,String> dependentServiceB){
this.dependentServiceB = dependentServiceB;
}
}
如果您不能明确说明您想要哪个 bean,您可能需要重新考虑在此处添加泛型。首先有一些利基原因想要这样做,并且依赖注入的流程仍然是完全可预测的,即使您不控制对象的生命周期。
推荐阅读
- python - 比较熊猫中的列值
- azure-cli - Azure CLI - 删除括号
- react-native - 与 React Native 背后的内容交互
? - amazon-emr - 使用 Hudi 时无法在 EMR 中的 AWS Glue 目录上运行 spark.sql
- entity-framework - 我应该如何为 Blazor 配置实体框架生命周期?
- github - 添加一个 gitignore 文件
- c# - 继承自抽象类的泛型类的 C# 类型
- python - 为什么 pyrlp.Serializable 类不允许在初始化后编辑属性?如何才能做到这一点?
- javascript - 如何在 Electron 中删除 DOM 元素
- swift - 为什么我的 TableViewController 只返回一个可折叠部分?