Spring嵌套的自动装配泛型抛出NoUniqueBeanDefinitionException

时间:2019-01-31 17:26:48

标签: java spring

是否可以在构造函数中将泛型类型自动装配为其他泛型类型?我目前有这样的结构:

@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的子类?

1 个答案:

答案 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,则可能需要重新考虑在此处添加泛型。首先有很多利基原因想要这样做,即使您不控制对象的生命周期,依赖项注入的流程仍然是完全可预测的。