[英]SpringBoot Autowiring a generic type fails because of multiple possible beans
我正在尝试创建一个自动装配类型为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
注释让我选择了一个组件,这不是我想要的,因为我想使用firstTaskService
和secondTaskService
与同一个类( TaskScheduler
)。
怎么可以这样做?
编辑:澄清:我的目标是重用TaskScheduler
类和扩展TaskService
类的不同类(不要使用在TaskScheduler
一起扩展TaskService
多个类)。
如果您想要自动连接所有扩展TaskService
bean,您可以将自动连接字段更改为List
:
@Component
public class TaskScheduler<T extends TaskService>{
@Autowired
private List<T> taskService;
}
通过这种方式,Spring应该在List
放入所有可扩展TaskService
autowireable bean。
编辑 :因为你想在dinamically中选择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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.