SpringBoot自动装配通用类型失败,因为可能有多个bean
我正在尝试创建一个可以自动装配T类型对象的类。
@component public class TaskScheduler<T extends TaskService>{
@Autowired
private T taskService;
}
问题是我有两个扩展的组件TaskService。
@componentpublic class firstTaskService extends TaskService {
}
和
@componentpublic class secondTaskService extends TaskService {
}
因此,当执行此行(ts正在创建)时
@AutowiredTaskScheduler<firstTaskService> ts;
我收到此错误:
TaskScheduler中构造函数的参数1需要单个bean,但是找到2
我得到的消息是这样的:
考虑将一个bean标记为@Primary,更新使用者以接受多个bean,或者使用@Qualifier标识应该消耗的bean。
但是,从我的理解中,@Primary和@Qualifier注解让我选择的组件,这不是我想要的,因为我想用1
firstTaskService和secondTaskService与同一类(TaskScheduler)。
怎么办呢?
澄清:我的目标是将TaskScheduler类与扩展该类的不同类重用TaskService(不要使用TaskService在中一起扩展的多个类TaskScheduler)。
回答:
如果要自动连线所有扩展的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子类和相关子类应保持不变。按如下所示设置配置类:
@Configurationpublic 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以这种方式测试您的:
@AutowiredTaskScheduler<firstTaskService> ts;
以上是 SpringBoot自动装配通用类型失败,因为可能有多个bean 的全部内容, 来源链接: utcz.com/qa/435456.html

