[英]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.