由于多个可能的 bean,Spring Boot 自动装配泛型失败
SpringBoot Autowiring a generic type fails because of multiple possible beans
我正在尝试创建一个 class 自动装配类型为 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;
我收到这个错误:
Description:
Parameter 1 of constructor in TaskScheduler required a single bean, but 2 were found
我收到的消息是这样建议的:
Action: Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify
the bean that should be consumed.
但据我了解,@Primary
和 @Qualifier
注释让我选择了其中一个组件,这不是我想要的,因为我想使用 firstTaskService
和 secondTaskService
与相同的 class (TaskScheduler
).
这是怎么做到的?
编辑: 说明:我的 objective 是重用 TaskScheduler
class 和不同的 class 扩展TaskService
class(不要在 TaskScheduler
中使用多个 class 一起扩展 TaskService
)。
如果你想自动装配所有扩展 TaskService
的 bean,也许你应该将自动装配字段更改为 List
:
@Component
public class TaskScheduler<T extends TaskService>{
@Autowired
private List<T> taskService;
}
这样 Spring 应该放入 List
所有扩展 TaskService
.
的自动装配 bean
编辑:因为你想动态地 select TaskService
的类型,我发现的唯一方法如下。首先,重新定义你的 TaskScheduler
:
public class TaskScheduler <T extends TaskService>{
private T taskService;
public void setTaskService(T taskService) {
this.taskService = taskService;
}
}
您的 TaskService
和相关子 class 应该保持不变。设置配置class如下:
@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;
我正在尝试创建一个 class 自动装配类型为 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;
我收到这个错误:
Description: Parameter 1 of constructor in TaskScheduler required a single bean, but 2 were found
我收到的消息是这样建议的:
Action: Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed.
但据我了解,@Primary
和 @Qualifier
注释让我选择了其中一个组件,这不是我想要的,因为我想使用 firstTaskService
和 secondTaskService
与相同的 class (TaskScheduler
).
这是怎么做到的?
编辑: 说明:我的 objective 是重用 TaskScheduler
class 和不同的 class 扩展TaskService
class(不要在 TaskScheduler
中使用多个 class 一起扩展 TaskService
)。
如果你想自动装配所有扩展 TaskService
的 bean,也许你应该将自动装配字段更改为 List
:
@Component
public class TaskScheduler<T extends TaskService>{
@Autowired
private List<T> taskService;
}
这样 Spring 应该放入 List
所有扩展 TaskService
.
编辑:因为你想动态地 select TaskService
的类型,我发现的唯一方法如下。首先,重新定义你的 TaskScheduler
:
public class TaskScheduler <T extends TaskService>{
private T taskService;
public void setTaskService(T taskService) {
this.taskService = taskService;
}
}
您的 TaskService
和相关子 class 应该保持不变。设置配置class如下:
@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;