1、前言
經常遇到這樣的一個需求,前端傳的實體類型相同,后端需要根據實體類中的某一個字符串,動態地調用某一個類的方法。
在SpringBoot中,我們可以理解成,一個Controller接口對應多個ServiceImpl,使用這種方式,如果后期需要添加一個功能,僅僅創建一個ServiceImpl就可以滿足需求,而不用再額外創建一個Controller接口。
2、代碼演示
我們先定義一個接口
public interface UserService {
兩個實現類
public class StudentServiceImpl implements UserService {
public class TeacherServiceImpl implements UserService {
實現動態調用的核心類
public class UserContext { Map<String, UserService> userMap; public UserService getUserService(String type) { return userMap.get(type);
Spring會自動地將形如(@Service后面的名稱,實現該接口的類)注入到該userMap中
在啟動后,userMap中就存在兩個元素,("student",StudentServiceImpl)與("teacher",TeacherServiceImpl)
getUserService方法返回userMap中key=type的UserService對象
實體類
public String getType() { public void setType(String type) { public String getTask() { public void setTask(String task) {
Controller層接口
public class UserController { public String getTask(@RequestBody User user) { UserService userService = userContext.getUserService(user.getType()); return userService.task();
3、可能用到的場景舉例
關于庫存的儀表盤統計
前端傳入區域id,倉庫id,物品id等信息
后端依據參數動態地選擇某一個物品實現類,最后返回統計的信息。
這里有幾個問題,為什么不一次性將所有物品id傳入,一次性獲取所有物品的庫存?
一次性傳入,可能后端處理時間邊長,失敗率也高,一旦失敗,整個儀表盤沒有任何數據。而且后期可能面臨的一個需求,不同的物品,需要有不同的接口刷新速度,暢銷的物品接口調用頻率快。所以可能需要將物品分組,一個小組是同一種類型,使用一個實現類。
比如,這里有100種物品,按類型或者其他屬性分成了10組,每個組之間,有一個不同的屬性groupId,但10組共用一個接口,進入接口后,再進入10個不同的實現類,在實現類中調用具體的計算邏輯。
|