小编典典

SpringBoot自动装配通用类型失败,因为可能有多个bean

spring-boot

我正在尝试创建一个可以自动装配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;

我收到此错误:

说明: TaskScheduler中构造函数的参数1需要单个bean,但是找到2

我得到的消息是这样的:

行动: 考虑将一个bean标记为@Primary,更新使用者以接受多个bean,或者使用@Qualifier标识应该消耗的bean。

但是,从我的理解中,@Primary@Qualifier注解让我选择的组件,这不是我想要的,因为我想用1
firstTaskServicesecondTaskService与同一类(TaskScheduler)。

怎么办呢?

编辑:
澄清:我的目标是将TaskScheduler类与扩展该类的不同类重用TaskService(不要使用TaskService在中一起扩展的多个类TaskScheduler)。


阅读 2065

收藏
2020-05-30

共1个答案

小编典典

如果要自动连线所有扩展的bean,TaskService也许应该将自动连线字段更改为List

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

这样,Spring应该放入List所有可扩展的自动装配bean TaskService

编辑 :由于您想从动力学上选择TaskService我发现的唯一方法的类型,因此,如下所示。首先,重新定义您的TaskScheduler

public class TaskScheduler <T extends TaskService>{

    private T taskService;

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

您的TaskService子类和相关子类应保持不变。按如下所示设置配置类:

@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;
2020-05-30