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