最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot業(yè)務(wù)策略模式多實現(xiàn)類注入過程(Map注入)

 更新時間:2026年06月09日 09:16:19   作者:小胖-Vi  
這段文章主要討論了在業(yè)務(wù)處理過程中遇到的登錄場景,通過策略模式解決代碼冗余和維護(hù)困難的問題,具體介紹了策略模式的應(yīng)用場景、實現(xiàn)方式以及帶來的好處,適用于需要根據(jù)不同條件選擇不同實現(xiàn)邏輯的場景

前言

在業(yè)務(wù)處理的過程中遇見一個場景,登錄分A,B,C,他們都是對應(yīng)的實現(xiàn)都是增刪改查,但是不同的類型對應(yīng)不同的平臺登錄方式,同時對應(yīng)的增刪改查業(yè)務(wù)邏輯有存在差異,這個時候如果不想辦法設(shè)計代碼就會出現(xiàn)A,B,C三種類型都要寫一個對應(yīng)接口(XXXserver),然后分別再去實現(xiàn)他們(XXXserverImpl),如果后來再增加一個平臺登錄,我們又要去重復(fù)相關(guān)接口和實現(xiàn),不僅顯得代碼冗余,更是不好維護(hù)和管理,所以利用設(shè)計模式---策略模式就解決了這個問題。

策略模式的引入

一個接口有多個實現(xiàn)

public interface LoginService {


    String passwordSalt = "test";


    /**
     * @param postAccessToken 請求體
     */
    ExecResult<String> prop(Login postAccessToken);

    /**
     * 是否支持特定業(yè)務(wù)信息的處理
     *
     * @return
     */
    Boolean isSupported(Login postAccessToken);
}
//實現(xiàn)一
@Slf4j
@Service
public class DingdingServiceImpl implements LoginService {



    @Override
    public ExecResult<String> prop(Login postAccessToken) {
 
      System.out.println("釘釘用戶");
        return ExecResultUtil.success(JwtUtil.build());
    }

    @Override
    public Boolean isSupported(Login postAccessToken) {
        return Objects.equals(GrantTypeEnum.DINGDING.getCode(), postAccessToken.getGrantType());
    }
}
//實現(xiàn)二
@Service
public class PasswordLoginServiceImpl implements LoginService {


    @Autowired
    private UserAccountService userAccountService;

    @Override
    public ExecResult<String> prop(Login postAccessToken) {
      
      System.out.println("普通用戶");
    return ExecResultUtil.success(JwtUtil.build());
    }

    @Override
    public Boolean isSupported(Login postAccessToken) {
        return Objects.equals(GrantTypeEnum.PASSWORD.getCode(), postAccessToken.getGrantType());
    }
}
//實現(xiàn)三
@Service
public class SysPasswordLoginServiceImpl implements LoginService {


    @Autowired
    private UserAccountService userAccountService;

    @Override
    public ExecResult<String> prop(Login postAccessToken) {
       
      System.out.println("系統(tǒng)用戶");
return ExecResultUtil.success(JwtUtil.build());
    }

    @Override
    public Boolean isSupported(Login postAccessToken) {
        return Objects.equals(GrantTypeEnum.SYS_PASSWORD.getCode(), postAccessToken.getGrantType());
    }
}

枚舉類型

@AllArgsConstructor
public enum GrantTypeEnum {

    PASSWORD("password", "普通用戶密碼"),
    PHONE("phone", "普通手機(jī)驗證碼"),
    WE_CHAT("wechat", "普通微信"),
    DINGDING("dingding", "普通釘釘"),

    SYS_PASSWORD("sys_password", "系統(tǒng)用戶密碼"),
    SYS_PHONE("sys_phone", "系統(tǒng)手機(jī)驗證碼"),
    SYS_WE_CHAT("sys_wechat", "系統(tǒng)微信"),
    SYS_DINGDING("sys_dingding", "系統(tǒng)釘釘"),
    ;
    private String code;

    private String message;

    public String getCode() {
        return this.code;
    }

    public String getMessage() {
        return this.message;
    }}

寫一個公共的類來判斷獲取對應(yīng)的實現(xiàn)類

@Service
public class LoginServiceImpl {

//關(guān)鍵在這個,原理:當(dāng)一個接口有多個實現(xiàn)類的時候,key為實現(xiàn)類名,value為實現(xiàn)類對象
    private Map<String, LoginService> procMap = new ConcurrentHashMap<>();

    @Autowired(required = false)//這個注入了多個實現(xiàn)類對象
    private List<LoginService> procList = Collections.emptyList();

    public ExecResult<String> prop(Login login) {

        LoginService proc = getProc(login);
        if (null == proc) {
            throw new RuntimeException("no grant type:" + login.getGrantType());
        }
        return proc.prop(login);
    }

    private LoginService getProc(Login grantType) {
        LoginService querier = procMap.get(grantType.getGrantType());
        if (querier != null) {
            return querier;
        }
        for (LoginService item : procList) {
            if (item.isSupported(grantType)) {
                querier = item;
                procMap.put(grantType.getGrantType(), querier);
                return querier;
            }
        }
        return null;
    }

}

控制層(為了測試用,根據(jù)業(yè)務(wù)使用,不一定用在控制層哈)

    @Autowired
    private LoginServiceImpl loginService;


    @ApiOperation(value = "登錄")
    @PostMapping("/login")
    public ExecResult<String> postAccessToken(@RequestBody Login login) {
        return loginService.prop(login);
    }

測試

完結(jié)撒花 ?。?!

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • @DateTimeFormat和@JsonFormat注解的用法及說明

    @DateTimeFormat和@JsonFormat注解的用法及說明

    通過在實體類屬性上使用`@DateTimeFormat`和`@JsonFormat`注解,可以實現(xiàn)日期時間格式的入?yún)⒑统鰠⒏袷交?確保前端傳入的參數(shù)能夠正確解析,并且后端返回的日期時間格式符合需求
    2025-11-11
  • 關(guān)于Java8新特性O(shè)ptional類的詳細(xì)解讀

    關(guān)于Java8新特性O(shè)ptional類的詳細(xì)解讀

    Optional類是一個容器類,它可以保存類型T的值,代表這個值存在?;蛘邇H僅保存null,表示這個值不存在,原來用 null 表示一個值不存在,現(xiàn)在Optional 可以更好的表達(dá)這個概念。并且可以避免空指針異常,需要的朋友可以參考下
    2023-05-05
  • java并發(fā)編程之同步器代碼示例

    java并發(fā)編程之同步器代碼示例

    這篇文章主要介紹了java并發(fā)編程之同步器代碼示例,分享了相關(guān)代碼,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Java使用RabbitMQ保證消息冪等性的方法步驟

    Java使用RabbitMQ保證消息冪等性的方法步驟

    在Java中使用RabbitMQ時,保證消息處理的冪等性至關(guān)重要,冪等性意味著即使同一消息被處理多次,處理的結(jié)果也是一致的,本文就來詳細(xì)的介紹一下Java使用RabbitMQ保證消息冪等性的方法步驟,感興趣的可以了解一下
    2025-10-10
  • Java 中引入內(nèi)部類的意義?

    Java 中引入內(nèi)部類的意義?

    這篇文章主要介紹了Java 中引入內(nèi)部類的意義?文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,,需要的朋友可以參考下
    2019-06-06
  • SpringBoot集成ElasticSearch實現(xiàn)minio文件內(nèi)容全文檢索

    SpringBoot集成ElasticSearch實現(xiàn)minio文件內(nèi)容全文檢索

    這篇文章詳細(xì)介紹了如何在Spring?Boot項目中集成Elasticsearch和Kibana,包括Docker安裝、中文分詞器安裝、后端代碼實現(xiàn)以及前端查詢組件封裝,需要的朋友可以參考下
    2024-11-11
  • Spring源碼剖析之Spring處理循環(huán)依賴的問題

    Spring源碼剖析之Spring處理循環(huán)依賴的問題

    大家都知道循環(huán)依賴依賴指的是Bean與Bean之間的依賴關(guān)系,循環(huán)依賴指的是兩個或者多個Bean相互依賴,本文通過代碼示例給大家講解Spring處理循環(huán)依賴的問題,感興趣的朋友一起看看吧
    2021-06-06
  • Java二叉樹路徑和代碼示例

    Java二叉樹路徑和代碼示例

    這篇文章主要介紹了Java二叉樹路徑和代碼示例,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • mybatis插入一條數(shù)據(jù)返回相應(yīng)數(shù)據(jù)ID問題及解決

    mybatis插入一條數(shù)據(jù)返回相應(yīng)數(shù)據(jù)ID問題及解決

    MyBatis插入數(shù)據(jù)并獲取自增ID的方法,通過設(shè)置useGeneratedKeys=true和keyProperty屬性,可以自動將生成的ID賦值給實體對象的相應(yīng)屬性
    2026-05-05
  • Spring 整合Shiro 并擴(kuò)展使用EL表達(dá)式的實例詳解

    Spring 整合Shiro 并擴(kuò)展使用EL表達(dá)式的實例詳解

    Shiro是一個輕量級的權(quán)限控制框架,應(yīng)用非常廣泛。本文的重點是介紹Spring整合Shiro,并通過擴(kuò)展使用Spring的EL表達(dá)式。需要的朋友可以參考下
    2018-03-03

最新評論

阿拉善左旗| 郁南县| 平陆县| 泉州市| 凤城市| 吉木萨尔县| 松原市| 嘉善县| 云安县| 南阳市| 淮南市| 诸暨市| 易门县| 五华县| 浦县| 永城市| 宁都县| 六枝特区| 简阳市| 沙田区| 固阳县| 景泰县| 布拖县| 于都县| 邓州市| 龙里县| 平罗县| 蒙山县| 涪陵区| 朝阳县| 邛崃市| 德阳市| 玛沁县| 库尔勒市| 上饶市| 礼泉县| 新源县| 建阳市| 静宁县| 吉林省| 靖远县|