由于多个可能的 bean,Spring Boot 自动装配泛型失败

SpringBoot Autowiring a generic type fails because of multiple possible beans

我正在尝试创建一个 class 自动装配类型为 T 的对象。

@component    
public class TaskScheduler<T extends TaskService>{
    @Autowired
    private T taskService;
}

问题是我有两个扩展 TaskService.

的组件
@component
public class firstTaskService extends TaskService {

}

@component
public class secondTaskService extends TaskService {

}

所以当这一行被执行时(ts正在被创建)

@Autowired
TaskScheduler<firstTaskService> ts;

我收到这个错误:

Description: Parameter 1 of constructor in TaskScheduler required a single bean, but 2 were found

我收到的消息是这样建议的:

Action: Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed.

但据我了解,@Primary@Qualifier 注释让我选择了其中一个组件,这不是我想要的,因为我想使用 firstTaskServicesecondTaskService 与相同的 class (TaskScheduler).

这是怎么做到的?

编辑: 说明:我的 objective 是重用 TaskScheduler class 和不同的 class 扩展TaskService class(不要在 TaskScheduler 中使用多个 class 一起扩展 TaskService)。

如果你想自动装配所有扩展 TaskService 的 bean,也许你应该将自动装配字段更改为 List:

@Component    
public class TaskScheduler<T extends TaskService>{
    @Autowired
    private List<T> taskService;
}

这样 Spring 应该放入 List 所有扩展 TaskService.

的自动装配 bean

编辑:因为你想动态地 select TaskService 的类型,我发现的唯一方法如下。首先,重新定义你的 TaskScheduler:

public class TaskScheduler <T extends TaskService>{

    private T taskService;

    public void setTaskService(T taskService) {
        this.taskService = taskService;
    }
}

您的 TaskService 和相关子 class 应该保持不变。设置配置class如下:

@Configuration
public class TaskConf {

    @Autowired
    private FirstTaskService firstTaskService;

    @Autowired
    private SecondTaskService secondTaskService;

    @Bean
    public TaskScheduler<FirstTaskService> firstTaskServiceTaskScheduler(){
        TaskScheduler<FirstTaskService> t =  new TaskScheduler<>();
        t.setTaskService(firstTaskService);
        return t;
    }

    @Bean
    public TaskScheduler<SecondTaskService> secondTaskServiceTaskScheduler(){
        TaskScheduler<SecondTaskService> t =  new TaskScheduler<>();
        t.setTaskService(secondTaskService);
        return t;
    }

}

然后用这种方式测试你的TaskScheduler

@Autowired
TaskScheduler<firstTaskService> ts;