gpt4 book ai didi

java - Spring 嵌套 Autowiring 泛型抛出 NoUniqueBeanDefinitionException

转载 作者:太空宇宙 更新时间:2023-11-04 09:53:01 25 4
gpt4 key购买 nike

是否可以在构造函数中将泛型类型 Autowiring 到不同的泛型类型中?我目前的结构如下:

@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();
}

}

现在,如果我尝试在其他地方 Autowiring ExampleService类,它会抛出一个NoUniqueBeanDefinitionException,其中包含“没有可用的'....ServiceB<?>'类型的合格bean:预期单个匹配bean,但发现2:serviceBwithInt,serviceBwithLong”。

是否可以像这样解决它,或者我是否必须为每个不同的泛型类型实现 ServiceA 的子类?

最佳答案

考虑到类型删除的工作原理,这两个 bean 都可以被注入(inject),因为 Java 会接受这两个 bean 作为构造函数的有效参数。

如果您想明确注入(inject)哪些内容,请使用@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,您可能需要重新考虑在此处添加泛型。首先有一些特殊的原因想要这样做,即使您不控制对象的生命周期,依赖注入(inject)的流程仍然是完全可预测的。

关于java - Spring 嵌套 Autowiring 泛型抛出 NoUniqueBeanDefinitionException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54466115/

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