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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;并且与其他租户隔离。多租户允许有效利用…