基于 Spring Boot 策略模式的短信服務提供商動態切換實現

一、整體設計思路

為了實現在短信服務提供商變更時,不修改現有代碼就能無縫切換到新服務實現,可采用策略模式結合依賴注入以及配置中心化管理的方式來設計軟件系統。

二、 具體實現步驟

1. 定義統一接口(以短信服務為例,接口命名為 SmsService

創建一個抽象的接口,用于定義該類服務的統一行為規范,所有具體服務提供商的實現類都需要遵循這個接口所定義的方法。例如:

public interface SmsService {Response sendSms(Request request);
}

這里定義了 sendSms 方法,意味著不同短信服務提供商的具體實現類都要實現該方法來完成發送短信的操作,從外部調用角度來看,調用這個接口的 sendSms 方法就能獲取相應的短信發送服務結果,無需關心具體是由哪個服務商來提供服務。

2. 實現具體服務提供商

針對不同的短信服務提供商,分別實現上述定義的 SmsService 接口,并在各自的實現類中封裝對應服務商特有的業務邏輯。比如:

// 阿里云短信服務實現
@Service("aliyunSmsService")
public class AliyunSmsServiceImpl implements SmsService {public AliyunSmsServiceImpl(@Value("${sms.aliyun.accessKey}") String accessKey,@Value("${sms.aliyun.secretKey}") String secretKey) { /* 初始化相關參數 */ }@Overridepublic Response sendSms(Request request) {// 此處編寫調用阿里云短信 API 的具體邏輯}
}// 騰訊云短信服務實現
@Service("tencentSmsService")
public class TencentSmsServiceImpl implements SmsService {public TencentSmsServiceImpl(@Value("${sms.tencent.appId}") String appId,@Value("${sms.tencent.secretKey}") String secretKey) { /* 初始化相關參數 */ }@Overridepublic Response sendSms(Request request) {// 編寫調用騰訊云短信 API 的具體邏輯}
}
3. 配置文件管理(以 application.yml 為例)

在配置文件中指定當前使用的短信服務提供商,同時配置各個提供商所需的相關參數,方便后續根據配置來獲取和使用對應的服務。示例配置如下:

sms:provider: aliyun  # 可選值如: aliyun, tencent 等,代表不同的短信服務提供商aliyun:accessKey: your-aliyun-keysecretKey: your-aliyun-secrettencent:appId: your-tencent-app-idsecretKey: your-tencent-secret
4. 動態選擇服務實現(配置類)

創建一個 Spring 配置類,用于根據配置文件中指定的短信服務提供商名稱,從 Spring 容器中獲取對應的具體服務實現類實例,并將其作為一個 Bean 提供給其他需要使用短信服務的地方。代碼如下:

@Configuration
public class SmsServiceConfig {@Beanpublic SmsService smsService(@Value("${sms.provider}") String provider,Map<String, SmsService> smsServiceMap) {return smsServiceMap.get(provider + "SmsService");}
}

這里的 smsService 方法被標注為 @Bean,意味著該方法返回值會作為 Bean 被添加到 Spring 容器中供其他組件依賴注入使用。在方法參數中:

  • @Value("${sms.provider}") String provider 用于從配置文件中獲取當前指定的短信服務提供商名稱(如 "aliyun""tencent" 等)。
  • Map<String, SmsService> smsServiceMap 是 Spring 容器自動管理的一個 Map 結構,它的鍵(String)是各個實現了 SmsService 接口的 Bean 名稱(像 "aliyunSmsService""tencentSmsService" 等,由 @Service 注解指定名稱時確定),值(SmsService)就是對應的實現了 SmsService 接口的具體短信服務 Bean 實例。Spring 容器在初始化 SmsServiceConfig 類并處理 smsService 這個 @Bean 方法時,會自動查找類型為 Map<String, SmsService>Bean(也就是收集了所有實現 Sms

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/84388.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84388.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/84388.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解決SQL Server SQL語句性能問題(9)——SQL語句改寫(1)

9.4. SQL語句改寫 目前主流關系庫的高版本中,特別是作為主流商業關系庫的SQL Server來講,大部分場景中,同一語義和結果集的SQL語句,其不同寫法并不會影響CBO為SQL語句生成和選擇最合適、最高效的查詢計劃。但少數情況下,不同寫法的同一語義和結果集的SQL語句,CBO也許會為…

設計模式復習小結

1.容易忘得設計原則 接口隔離&#xff1a;指接口中的功能太雜則可以拆分一下。防止實現類實現了接口后自動依賴了一些不需要的功能。不同功能拆分成不同的接口。 里氏代換&#xff1a;強調父類能出現的地方&#xff0c;子類一定能正常跑。 迪米特法則&#xff1a;又稱最少知…

昇騰CANN集合通信技術解讀——細粒度分級流水算法

隨著AI技術的演進&#xff0c;模型的計算復雜度和參數量呈現幾何級數增長&#xff0c;這使得傳統單機單卡部署在算力供給與顯存容量方面顯得力不從心&#xff0c;從而直接推動了分布式訓練/推理技術的快速發展。今年年初爆火的DeepSeek在訓練及推理Prefill階段采用了分級流水Al…

水泥廠自動化升級利器:Devicenet轉Modbus rtu協議轉換網關

在水泥廠的生產流程中&#xff0c;工業自動化網關起著至關重要的作用&#xff0c;尤其是JH-DVN-RTU疆鴻智能Devicenet轉Modbus rtu協議轉換網關&#xff0c;為水泥廠實現高效生產與精準控制提供了有力支持。 水泥廠設備眾多&#xff0c;其中不少設備采用Devicenet協議。Devicen…

使用Matplotlib創建炫酷的3D散點圖:數據可視化的新維度

文章目錄 基礎實現代碼代碼解析進階技巧1. 自定義點的大小和顏色2. 添加圖例和樣式美化3. 真實數據應用示例實用技巧與注意事項完整示例(帶樣式)應用場景在數據科學和可視化領域,三維圖形能為我們提供更豐富的數據洞察。本文將手把手教你如何使用Python的Matplotlib庫創建引…

Copilot for Xcode (iOS的 AI輔助編程)

Copilot for Xcode 簡介Copilot下載與安裝 體驗環境要求下載最新的安裝包安裝登錄系統權限設置 AI輔助編程生成注釋代碼補全簡單需求代碼生成輔助編程行間代碼生成注釋聯想 代碼生成 總結 簡介 嘗試使用了Copilot&#xff0c;它能根據上下文補全代碼&#xff0c;快速生成常用…

React 進階特性

1. ref ref 是 React 提供的一種機制,用于訪問和操作 DOM 元素或 React 組件的實例。它可以用于獲取某個 DOM 元素的引用,從而執行一些需要直接操作 DOM 的任務,例如手動設置焦點、選擇文本或觸發動畫。 1.1. 使用 ref 的步驟 1. 創建一個 ref:使用 React.createRef 或 …

基于PHP的連鎖酒店管理系統

有需要請加文章底部Q哦 可遠程調試 基于PHP的連鎖酒店管理系統 一 介紹 連鎖酒店管理系統基于原生PHP開發&#xff0c;數據庫mysql&#xff0c;前端bootstrap。系統角色分為用戶和管理員。 技術棧 phpmysqlbootstrapphpstudyvscode 二 功能 用戶 1 注冊/登錄/注銷 2 個人中…

【大廠機試題解法筆記】報文響應時間

題目 IGMP 協議中&#xff0c;有一個字段稱作最大響應時間 (Max Response Time) &#xff0c;HOST收到查詢報文&#xff0c;解折出 MaxResponseTime 字段后&#xff0c;需要在 (0&#xff0c;MaxResponseTime] 時間 (s) 內選取隨機時間回應一個響應報文&#xff0c;如果在隨機…

邏輯回歸暴力訓練預測金融欺詐

簡述 「使用邏輯回歸暴力預測金融欺詐&#xff0c;并不斷增加特征維度持續測試」的做法&#xff0c;體現了一種逐步建模與迭代驗證的實驗思路&#xff0c;在金融欺詐檢測中非常有價值&#xff0c;本文作為一篇回顧性記錄了早年間公司給某行做反欺詐預測用到的技術和思路。百度…

Python爬蟲實戰:研究demiurge框架相關技術

1. 引言 在當今數字化時代,互聯網上蘊含著海量的有價值信息。爬蟲技術作為獲取這些信息的重要手段,被廣泛應用于學術研究、商業分析、輿情監測等多個領域。然而,構建一個高效、穩定且可維護的爬蟲系統面臨諸多挑戰,如網頁結構復雜多變、反爬機制日益嚴格、數據處理流程繁瑣…

Jenkins | Jenkins構建成功服務進程關閉問題

Jenkins構建成功服務進程關閉問題 1. 原因2. 解決 1. 原因 Jenkins 默認會在構建結束時終止所有由構建任務啟動的子進程&#xff0c;即使使用了nohup或后臺運行符號&。 2. 解決 在啟動腳本中加上 BULID_IDdontkillme #--------------解決jenkins 自動關閉進程問題-----…

深度學習習題2

1.如果增加神經網絡的寬度&#xff0c;精確度會增加到一個特定閾值后&#xff0c;便開始降低。造成這一現象的可能原因是什么&#xff1f; A、即使增加卷積核的數量&#xff0c;只有少部分的核會被用作預測 B、當卷積核數量增加時&#xff0c;神經網絡的預測能力會降低 C、當卷…

猜字符位置游戲-position gasses

import java.util.*;public class Main {/*字符猜位置游戲;每次提交只能被告知答對幾個位置;根據提示答對的位置數推測出每個字符對應的正確位置;*/public static void main(String[] args) {char startChar A;int gameLength 8;List<String> ballList new ArrayList&…

解析兩階段提交與三階段提交的核心差異及MySQL實現方案

引言 在分布式系統的事務處理中&#xff0c;如何保障跨節點數據操作的一致性始終是核心挑戰。經典的兩階段提交協議&#xff08;2PC&#xff09;通過準備階段與提交階段的協調機制&#xff0c;以同步決策模式確保事務原子性。其改進版本三階段提交協議&#xff08;3PC&#xf…

Towards Open World Object Detection概述(論文)

論文&#xff1a;https://arxiv.org/abs/2103.02603 代碼&#xff1a;https://github.com/JosephKJ/OWOD Towards Open World Object Detection 邁向開放世界目標檢測 Abstract 摘要 Humans have a natural instinct to identify unknown object instances in their environ…

QT3D學習筆記——圓臺、圓錐

類名作用Qt3DWindow3D渲染窗口容器QEntity場景中的實體&#xff08;對象或容器&#xff09;QCamera控制觀察視角QPointLight點光源QConeMesh圓錐幾何網格QTransform控制實體的位置/旋轉/縮放QPhongMaterialPhong光照材質&#xff08;定義顏色、反光等&#xff09;QFirstPersonC…

CSS | transition 和 transform的用處和區別

省流總結&#xff1a; transform用于變換/變形&#xff0c;transition是動畫控制器 transform 用來對元素進行變形&#xff0c;常見的操作如下&#xff0c;它是立即生效的樣式變形屬性。 旋轉 rotate(角度deg)、平移 translateX(像素px)、縮放 scale(倍數)、傾斜 skewX(角度…

夏普比率(Sharpe ratio)?

具有投資常識的人都明白&#xff0c;投資光看收益是不夠的&#xff0c;還要看承受的風險&#xff0c;也就是收益風險比。 夏普比率描述的正是這個概念&#xff0c;即每承受一單位的總風險&#xff0c;會產生多少超額的報酬。 用數學公式描述就是&#xff1a; 其中&#xff1…

C#學習第29天:表達式樹(Expression Trees)

目錄 什么是表達式樹&#xff1f; 核心概念 1.表達式樹的構建 2. 表達式樹與Lambda表達式 3.解析和訪問表達式樹 4.動態條件查詢 表達式樹的優勢 1.動態構建查詢 2.LINQ 提供程序支持&#xff1a; 3.性能優化 4.元數據處理 5.代碼轉換和重寫 適用場景 代碼復雜性…