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

我正在尝试创建一个自动装配类型 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。


但据我了解,@Primaryand@Qualifier注释让我选择了其中一个组件,这不是我想要的,因为我想使用firstTaskService同secondTaskService一个类(TaskScheduler)。


怎么可能做到这一点?


编辑:澄清:我的目标是重用TaskScheduler具有扩展类的不同类的类(而不是使用在 中一起TaskService扩展的多个类)。TaskServiceTaskScheduler


慕村9548890
浏览 240回答 1
1回答

神不在的星期二

如果您想自动装配所有扩展的 bean,TaskService也许您应该将 autowired 字段更改为List:@Component&nbsp; &nbsp;&nbsp;public class TaskScheduler<T extends TaskService>{&nbsp; &nbsp; @Autowired&nbsp; &nbsp; private List<T> taskService;}这样,Spring 应该放入List所有可自动装配的 beans 扩展TaskService。编辑:因为你想动态地选择TaskService我发现的唯一方法的类型如下。首先,重新定义您的TaskScheduler:public class TaskScheduler <T extends TaskService>{&nbsp; &nbsp; private T taskService;&nbsp; &nbsp; public void setTaskService(T taskService) {&nbsp; &nbsp; &nbsp; &nbsp; this.taskService = taskService;&nbsp; &nbsp; }}您TaskService和相关的子类应该保持不变。设置一个配置类,如下所示:@Configurationpublic class TaskConf {&nbsp; &nbsp; @Autowired&nbsp; &nbsp; private FirstTaskService firstTaskService;&nbsp; &nbsp; @Autowired&nbsp; &nbsp; private SecondTaskService secondTaskService;&nbsp; &nbsp; @Bean&nbsp; &nbsp; public TaskScheduler<FirstTaskService> firstTaskServiceTaskScheduler(){&nbsp; &nbsp; &nbsp; &nbsp; TaskScheduler<FirstTaskService> t =&nbsp; new TaskScheduler<>();&nbsp; &nbsp; &nbsp; &nbsp; t.setTaskService(firstTaskService);&nbsp; &nbsp; &nbsp; &nbsp; return t;&nbsp; &nbsp; }&nbsp; &nbsp; @Bean&nbsp; &nbsp; public TaskScheduler<SecondTaskService> secondTaskServiceTaskScheduler(){&nbsp; &nbsp; &nbsp; &nbsp; TaskScheduler<SecondTaskService> t =&nbsp; new TaskScheduler<>();&nbsp; &nbsp; &nbsp; &nbsp; t.setTaskService(secondTaskService);&nbsp; &nbsp; &nbsp; &nbsp; return t;&nbsp; &nbsp; }}TaskScheduler然后以这种方式测试你的:@AutowiredTaskScheduler<firstTaskService> ts;
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java