簡體   English   中英

SpringBoot自動裝配泛型類型因多個可能的bean而失敗

[英]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注釋讓我選擇了一個組件,這不是我想要的,因為我想使用firstTaskServicesecondTaskService與同一個類( 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM