是否可以在构造函数中将泛型类型自动装配为其他泛型类型?我目前有这样的结构:
@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的子类?
答案 0 :(得分:0)
鉴于类型擦除的工作原理,这两个bean都有资格被注入,因为 Java 将接受这两个bean作为构造函数的有效参数。
如果您想明确说明要注入哪个,请使用@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,则可能需要重新考虑在此处添加泛型。首先有很多利基原因想要这样做,即使您不控制对象的生命周期,依赖项注入的流程仍然是完全可预测的。