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

时间:2019-02-20 15:42:26

标签: java spring spring-boot autowired

我正在尝试创建一个类,该类自动装配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进行标识   应该消耗的咖啡豆。

但是据我了解,@Primary@Qualifier注释使我选择了其中一种组件,这不是我想要的组件,因为我想使用firstTaskService和{{1} },并使用相同的班级(secondTaskService)。

这怎么办?

编辑:澄清:我的目标是将TaskScheduler类与扩展TaskScheduler类的不同类重用(不要使用扩展{{1} }一起放在TaskService中。

1 个答案:

答案 0 :(得分:4)

如果您想自动连接所有扩展TaskService的bean,也许应该将自动装配的字段更改为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;