我正在尝试创建一个类,该类自动装配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
中。
答案 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;