SpringBoot applicationContext.getBeansOfType獲取某一接口所有實現類,應用于策略模式

本文介紹了如何在Springboot項目中通過ApplicationContext獲取接口的實現類,并通過枚舉策略模式避免if/else,展示了如何使用`getBeansOfType`獲取`TrafficModeService`的實現,以及如何在實際場景中應用,如查詢交通方式費用

1 在實際工作中,我們經常會遇到一個接口及多個實現類的情況,并且在不同的條件下會使用不同的實現類。

應用場景

springboot?項目中通過 ApplicationContext.getBeansOfType(class) 獲取某一接口的所有實現類,并通過枚舉完成策略模式,替代 if/else,使代碼更加優雅易于拓展。

三、ApplicationContext.getBeansOfType(class) 介紹

? ? <T> Map<String, T> getBeansOfType(@Nullable Class<T> var1) throws BeansException;

從上面的源碼上我們可以看出來這個方法能返回一個接口的全部實現類(前提是所有實現類都必須由 Spring IoC 容器管理)?

        Map<String, TrafficModeService> map = applicationContext.getBeansOfType(TrafficModeService.class);

從上面的代碼上(下面案例中工廠類有) ,Map 中的 String 的值是各個實現類的名稱 busModeServiceImpl、trainModeServiceImpl(首字母小寫),Map 中的 value 是各個 key 對應的策略實現類

案例 demo

1、TrafficCodeEmun 枚舉制定接口信息@AllArgsConstructor
public enum TrafficCodeEmun {TRAIN("TRAIN","火車"),BUS("BUS","大巴"),;private final String code;private final String desc;
}2、TrafficModeFactory 工廠類獲取接口實現 bean,并存儲到 ConcurrentHashMap,通過枚舉獲取對應的實現 bean@Component
@Slf4j
public class TrafficModeFactory implements ApplicationContextAware {public static final ConcurrentHashMap<TrafficCodeEmun, TrafficModeService> TRAFFIC_BEAN_MAP = new ConcurrentHashMap<>();@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {log.info("TrafficModeFactory 啟動開始");Map<String, TrafficModeService> map = applicationContext.getBeansOfType(TrafficModeService.class);map.forEach((key, value) -> TRAFFIC_BEAN_MAP.put(value.getCode(), value));log.info("TrafficModeFactory 啟動完成");}public static <T extends TrafficModeService> T getTrafficMode(TrafficCodeEmun code) {return (T) TRAFFIC_BEAN_MAP.get(code);}}3、定義策略接口 TrafficModeServicepublic interface TrafficModeService {/*** 查詢交通方式編碼* @return 編碼*/TrafficCodeEmun getCode();/*** 查詢交通方式的費用,單位:分* @return 費用*/Integer getFee();}4、策略實現類 BusModeServiceImpl、TrainModeServiceImpl@Service
public class TrainModeServiceImpl implements TrafficModeService {/*** 查詢交通方式編碼* @return 編碼*/@Overridepublic TrafficCodeEmun getCode() {return TrafficCodeEmun.TRAIN;}/*** 查詢交通方式的費用,單位:分* @return 費用*/@Overridepublic Integer getFee() {return 5000;}}5、定義 controller@PostMapping("/test3")public Integer test3() {Integer fee = TrafficModeFactory.getTrafficMode(TrafficCodeEmun.TRAIN).getFee();return fee;}注意點:
一個策略接口被多個策略實現類所實現,具體使用哪一種根據用戶選擇的類型來和 Map 里的 key 做匹配,獲取對應的實現來調用具體的策略方法。
使用 ConcurrentHashMap ,而不使用 HashMap ,是 put 的時候,鍵和值都不能為空,防止 key 對應的實現類沒有注入進去,導致空指針的問題。

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

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

相關文章

大模型問題:幻覺分類+原因+各個訓練階段產生幻覺+幻覺的檢測和評估基準

1. 什么是幻覺&#xff1f;大模型出現幻覺&#xff0c;簡而言之就是“胡說八道”。 用《A Survey on Hallucination in Large Language Models》1文中的話來講&#xff0c;是指模型生成的內容與現實世界事實或用戶輸入不一致的現象。 研究人員將大模型的幻覺分為事實性幻覺&…

智慧冷庫物聯網解決方案——實現降本增效與風險可控的冷庫管理新范式

一、冷庫管理痛點設備孤島化&#xff1a;冷庫品牌、型號分散&#xff0c;缺乏統一接入標準&#xff0c;數據互通難&#xff0c;依賴人工巡檢&#xff0c;故障響應滯后。能耗黑洞&#xff1a;制冷系統能耗占冷庫總運營成本的60%以上&#xff0c;傳統管理粗放&#xff0c;缺乏動態…

太空生活的八種要素

數代以來&#xff0c;科學家們一直在銀河系中搜尋地外行星存在生命的證據。他們試圖找到一組特定的環境條件與化學物質&#xff0c;在恰當的時間、恰當的地點交匯融合。 通過研究人類、植物、動物及微生物在地球上的生存與繁衍方式&#xff0c;科學家們已識別出生命演化所需的關…

Flutter 小技巧之有趣的 UI 骨架屏框架 skeletonizer

很久沒有更新過小技巧系列&#xff0c;今天簡單介紹一個非常好用的骨架屏框架 skeletonizer &#xff0c;它主要是通過將你現有的布局自動簡化為簡單的骨架&#xff0c;并添加動畫效果來實現加載過程&#xff0c;而使用成本則是簡單的添加一個 Skeletonizer 作為 parent &…

基于SpringBoot的寵物用品系統【2026最新】

作者&#xff1a;計算機學姐 開發技術&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源碼”。 專欄推薦&#xff1a;前后端分離項目源碼、SpringBoot項目源碼、Vue項目源碼、SSM項目源碼、微信小程序源碼 精品專欄&#xff1a;…

MongoDB 分片集群修改管理員密碼

記得關注一下博主&#xff0c;博主每天都會更新IT技術&#xff0c;讓你有意想不到的小收獲哦^_^ 文章目錄*記得關注一下博主&#xff0c;博主每天都會更新IT技術&#xff0c;讓你有意想不到的小收獲哦^_^*一、注釋MongoDB分片集群認證參數&#xff08;三臺主機都要操作&#xf…

C++函數重載與引用詳解

一、函數重載&#xff1a;同名函數的 “差異化生存”?1. 概念定義?函數重載&#xff08;Function Overloading&#xff09;是 C 的重要特性&#xff0c;指在同一作用域內&#xff0c;允許存在多個同名函數&#xff0c;但要求這些函數的參數列表必須不同。&#xff08;參數個數…

2025-08-17 李沐深度學習16——目標檢測

文章目錄1 介紹1.1 實際應用1.2 邊界框1.3 數據集2 錨框2.1 什么是錨框2.2 交并比2.3 分配標簽2.4 非極大值抑制3 經典目標檢測網絡3.1 R-CNN3.1.1 R-CNN (原始版本)3.1.2 Fast R-CNN3.1.3 Faster R-CNN3.1.4 Mask R-CNN3.2 單階段檢測器&#xff1a;SSD 和 YOLO3.2.1 SSD (Sin…

Bluedroid vs NimBLE

&#x1f539; 對比&#xff1a;Bluedroid vs NimBLE 1. 協議棧體積 & 內存占用 Bluedroid&#xff1a;體積大&#xff0c;RAM 占用也大&#xff08;幾十 KB 到上百 KB&#xff09;。NimBLE&#xff1a;輕量級&#xff0c;內存占用大概是 Bluedroid 的一半甚至更少。 &…

(純新手教學)計算機視覺(opencv)實戰八——四種邊緣檢測詳解:Sobel、Scharr、Laplacian、Canny

邊緣檢測詳解&#xff1a;Sobel、Scharr、Laplacian、Canny邊緣檢測是圖像處理和計算機視覺中的重要步驟&#xff0c;主要用于發現圖像中亮度變化劇烈的區域&#xff0c;即物體的輪廓、邊界或紋理特征。OpenCV 提供了多種常用的邊緣檢測算子&#xff0c;本教程將通過四種方法帶…

PyTorch 環境配置

目錄一、安裝 CUDA二、安裝 PyTorch1. 創建虛擬環境2. 安裝 PyTorch三、在 PyCharm 上創建一個 PyTorch 項目參考文章&#xff1a; 【2025年最新PyTorch環境配置保姆級教程&#xff08;附安裝包&#xff09;】 【超詳細 CUDA 安裝與卸載教程&#xff08;圖文教程&#xff09;】…

鴻蒙中冷啟動分析:Launch分析

啟動的分類&#xff08;熱身環節&#xff09; 啟動動類型觸發條件系統開銷 & 速度主要優化方向冷啟動應用進程不存在&#xff08;首次啟動或進程被殺后啟動&#xff09;最高&#xff0c;需創建進程、加載資源、初始化所有組件主要優化目標&#xff0c;減少主線程任務&…

告別盲目排查,PolarDB+DAS Agent智能運維新突破

1.概述 周五下午6點正準備下班&#xff0c;數據庫CPU突然爆滿&#xff0c;業務告警響成一片&#xff0c;DBA卻要手動翻查CPU/內存/負載等多個監控指標&#xff0c;還要查詢是否有新增慢SQL&#xff0c;死鎖等問題&#xff1f;” 這可能是數據庫DBA最鬧心的場景了&#xff0c;…

Linux------《零基礎到聯網:CentOS 7 在 VMware Workstation 中的全流程安裝與 NAT 網絡配置實戰》

&#xff08;一&#xff09;Linux的發行版Centos安裝與配置 下載Linux發行版本Centos:centos-7-isos-x86_64安裝包下載_開源鏡像站-阿里云點擊CentOS-7-x86_64-DVD-2009.torrent &#xff0c;CentOS-7-x86_64-DVD-2009.torrent是官方提供的 BT 種子文件&#xff08;176.1 KB&a…

iOS App 混淆工具實戰,教育培訓類 App 的安全保護方案

隨著在線教育、企業培訓、知識付費平臺的興起&#xff0c;越來越多的 iOS 應用需要保護自己的課程資源和核心邏輯。然而&#xff0c;教育類 App 面臨的最大風險并非傳統的外掛或刷分&#xff0c;而是 視頻盜鏈、題庫數據泄露、源碼邏輯被二次利用。 在這種場景下&#xff0c;合…

RabbitMQ:SpringAMQP Topic Exchange(主題交換機)

目錄一、案例需求二、基礎配置三、代碼實現TopicExchange與DirectExchange類似&#xff0c;區別在于RoutingKey可以是多個單次的列表&#xff0c;并且以.分割。 Queue與Exchange指定BindingKey時可以使用通配符&#xff1a; #&#xff1a;代指0個或多個單詞。*&#xff1a;代…

(純新手教學)計算機視覺(opencv)實戰六——圖像形態學(腐蝕、膨脹、開運算、閉運算、梯度、頂帽、黑帽)

圖像形態學在圖像處理中&#xff0c;形態學&#xff08;Morphology&#xff09; 是一種基于圖像中物體形狀的處理方法&#xff0c;通常用于二值圖像和灰度圖像。它通過腐蝕、膨脹等基本操作&#xff0c;結合開運算、閉運算、梯度運算、頂帽、黑帽等派生操作&#xff0c;來實現去…

學習嵌入式第三十五天

文章目錄網絡&#xff08;續上&#xff09;1.函數接口2.相關功能實現1.TCP連接2.UDP習題網絡&#xff08;續上&#xff09; 1.函數接口 sendto 原型&#xff1a;ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, sockle…

為什么給數據表加了索引,寫入速度反而變慢了

為數據表增加索引后之所以會導致寫入&#xff08;包括插入、更新、刪除&#xff09;操作的速度變慢&#xff0c;其根本原因在于索引本質上是一個獨立的、需要與主表數據保持實時同步的“數據結構”。這一機制的核心邏輯涵蓋五個方面&#xff1a;因為索引本質上是一個“獨立的數…

.NET Core 中采用獨立數據庫的SAAS(多租戶)方法

介紹多租戶是指一種軟件架構&#xff0c;其中軟件的單個實例在服務器上運行并為多個租戶提供服務。在基于 SAAS 的平臺中&#xff0c;租戶是指使用該平臺開展業務運營的客戶。每個租戶都擁有獨立的數據、用戶帳戶和配置設置&#xff0c;并且與其他租戶隔離。多租戶允許有效利用…