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