springboot利用Spring的自动装配,策略模式提高系统接口扩展能力,

前段时间有个简单的短信登录功能,需要集成短信服务实现短信发送,一开始用的阿里云,后面领导又说用天翼云,还说阿里云的保留,以后说不准还会集成其他的服务商,于是用nacos的热更新来解决动态切换,又为了代码优雅一点,就用了策略模式来实现这个功能

策略模式结构

Strategy:策略接口
StrategyImpl:策略实现类
Factory:策略工厂

一、策略接口

public interface SmsStrategy {/*** 策略接口*/void sendSms(String phone);
}

二、策略实现类

@Component(value = "aliyun")
public class aliyunSmsStrategyImpl implements SmsStrategy {@Overridepublic void sendSms(String phone) {System.out.println("aliyun");}
}
@Component(value = "tianyiyun")
public class tianyiyunSmsStrategyImpl implements SmsStrategy {@Overridepublic void sendSms(String phone) {System.out.println("tianyiyun");}
}

三、策略工厂

这是策略模式最重要的,利用Spring的自动装配原则,在项目启动时就会将被 @Component 注解标识的策略实现类注入到容器中,通过策略工厂的构造方法即可拿到所有的策略实现类

@Component
public class SmsFactory {private final Map<String, SmsStrategy> smsStrategies = Maps.newHashMapWithExpectedSize(4);/*** 利用构造函数在项目启动的时候将策略实现类注册到 map里* @param strategyMap*/public SmsFactory(Map<String, SmsStrategy> strategyMap) {this.smsStrategies.clear();this.smsStrategies.putAll(strategyMap);}//可以使用@Getter注解代替,这样写方便读者理解在Service层调用Context执行策略public Map<String, SmsStrategy> getSmsStrategyMap() {return smsStrategies;}}

四、nacos热更新

springboot集成nacos这里不赘述了
将 @RefreshScope 注解加在用到了 @Value 注解的类上

@Service
@RefreshScope
public class SmsServiceImpl implements SmsService {@Autowiredprivate SmsFactory smsFactory;@Value("${sms.strategy}")private String straetgyValue;@Overridepublic void sendSms(String phone) {smsFactory.getSmsStrategyMap().get(straetgyValue).sendSms("1353802907");}
}

nacos配置

server:port: 8991
spring:application:name: rpdemocloud:nacos:username: nacospassword: nacosdiscovery:enabled: trueserver-addr: 192.168.233.1:8848config:enabled: trueserver-addr: 192.168.233.1:8848refresh-enabled: trueshared-configs:- data-id: rpdemo.yamlrefresh: true

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/15543.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unity InputField的问题

unity 的inputField当focus时&#xff0c;弹起来的键盘样式会携带有一个输入显示。如果想自定义输入框的样式&#xff0c;就需要关闭inputfield的activateInput就是激发输入框的显示然后当inputfield被点击的时候&#xff0c;调用android原生键盘&#xff0c;并设置内容回调。我…

01-02.Vue的常用指令(二)

01-02.Vue的常用指令&#xff08;二&#xff09; 前言v-model&#xff1a;双向数据绑定v-model举例&#xff1a;实现简易计算器Vue中通过属性绑定为元素设置class 类样式引入方式一&#xff1a;数组写法二&#xff1a;在数组中使用三元表达式写法三&#xff1a;在数组中使用 对…

【全部更新完毕】2024电工杯B题详细思路代码成品文章教学:大学生平衡膳食食谱的优化设计及评价

大学生平衡膳食食谱的优化设计及评价 摘要 大学阶段是学生获取知识和身体发育的关键时期&#xff0c;也是形成良好饮食习惯的重要阶段。然而&#xff0c;当前大学生中存在饮食结构不合理和不良饮食习惯的问题&#xff0c;主要表现为不吃早餐或早餐吃得马虎&#xff0c;经常食用…

CentOS 常见命令详解

CentOS 是一种基于 Red Hat Enterprise Linux (RHEL) 的免费开源操作系统&#xff0c;以其稳定性和高效性广泛应用于服务器和企业环境中。对于系统管理员和开发人员来说&#xff0c;掌握 CentOS 的常见命令是日常工作中的必备技能。本文将详细介绍一些在 CentOS 上常用的命令&a…

算法提高之谜一样的牛

算法提高之谜一样的牛 核心思想&#xff1a;树状数组 初始化树状数组为1 表示所有高度都没有用过从后往前遍历h数组 分析身高 取当前h&#xff0c;即前面有h个比它高的 所以它是第h1个数求当前身高中 第h1个数 用二分mid求sum找到第k个数当前身高用过之后减1 #include <i…

高通Android 12/13冻结应用

最近开发SDK遇到冻结应用需求&#xff0c;于是简单记录下。总体而言比较简单&#xff0c;调用系统接口实现此功能。 涉及类与方法 IPackageManager .aidl # * As per {link android.content.pm.PackageManager#setApplicationEnabledSetting}.*/UnsupportedAppUsagevoid setA…

宝塔面板修改端口后无法登入

今天通过宝塔面板登录腾讯云主机&#xff0c;看到下面的提醒&#xff0c;顺便点进去随便改了个端口 本以为改端口是很简单事情&#xff0c;结果我改完之后面板立马登不上了&#xff0c;接下来我改了登录地址和端口也不行&#xff0c;我以为是防火墙的问题&#xff0c;增加了防火…

SpringBoot基于函数替换的热重载

背景 SpringBoot项目每次启动都很慢&#xff0c;有时候调试仅仅是改一点点东西&#xff0c;就要重启工作效率太低&#xff0c;希望能修改完代码&#xff0c;执行快捷键后就把该类的修改生效。&#xff08;仅限于Bean的修改生效&#xff09; 原理 SpringBoot的逻辑基本都是集…

ViT:1 从DETR说起

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提供了大模型领域最新技…

Pycharm在下载安装第三方库时速度慢或超时问题 / 切换国内镜像地址

pycharm下载第三方库速度极慢&#xff0c;搜索了一下&#xff0c;发现方法非常乱&#xff0c;稍作整理。这个问题一般都会出现&#xff0c;在我们开发中遇到的常见问题&#xff0c;根据以下解决方法&#xff0c;基本可以解决&#xff0c;但是不能100%保证 Installing packages …

打造一个增强版Kimi:可以生成图片、PPT、PDF文档、数据分析等

Kimi虽然在国内AI大模型中表现不错&#xff0c;但是和ChatGPT还是差不少功能。现在有一个很简单的方法&#xff0c;把kimi功能增强&#xff0c;使用效果大大改善&#xff0c;比如生成图片&#xff1a; 具体方法如下&#xff1a; 打开coze网站&#xff1a;https://www.coze.cn/…

Elementui里使用el-date-picker来选取指定时间段(时间段不超过31天)

需求描述&#xff1a; 1.禁止选择当前日期之后的所有日期2.选择的时间范围小于等于31天&#xff0c;其他日期禁用<el-date-picker v-model"historySubmitModel.historyDateTime" type"daterange" range-separator"- " start-placeholder"…

鸿蒙应用开发系列 篇四:鸿蒙系统应用开发基础

文章目录 系列文章概述ArkTS应用(Stage模型)示例应用示例代码使用模拟器运行应用使用真机运行应用应用程序包共享包应用配置文件(Stage模型)资源目录示例系列文章 鸿蒙应用开发系列 篇一:鸿蒙系统概述 鸿蒙应用开发系列 篇二:鸿蒙系统开发工具与环境

【c++基础】昆虫繁殖

说明 科学家在热带森林中发现了一种特殊的昆虫&#xff0c;这种昆虫的繁殖能力很强。每对成虫每过x个月产y对卵&#xff0c;每对卵要过两个月长成成虫。假设每个成虫不死&#xff0c;第一个月只有一对成虫&#xff0c;且卵长成成虫后的第一个月不产卵(过X个月产卵)&#xff0c…

C++容器之位集(std::bitset)

目录 1 概述2 使用实例3 接口使用3.1 constructor3.2 count_and_size3.3 test3.4 any3.5 none3.6 all3.7 set3.8 reset3.9 filp3.10 to_string3.11 to_ulong3.12 to_ullong3.13 operators1 概述 位集存储位(只有两个可能值的元素:0或1,true或false,…)。   该类模拟bool…

推荐一款自助分析的财务分析软件:奥威BI软件

奥威BI软件是一款支持多维度动态自助分析的软件&#xff0c;预设了智能财务分析方案&#xff0c;提供内存行列计算模型解决财务指标计算难题&#xff0c;界面简洁&#xff0c;以点击、拖曳操作为主&#xff0c;十分适合没有IT背景的财务人做财务分析。因此也经常有人说奥威BI软…

Spark搭建 Standalone模式详细步骤

Standalone模式概述&#xff1a; Standalone模式是Spark自带的一种集群模式&#xff08;本地集群&#xff0c;不依赖与外部集群&#xff0c;比如Yarn&#xff09;&#xff0c;可以真实地在多个机器之间搭建Spark集群的环境。 Standalone是完整的Spark运行环境,其中: Master角…

OpenFeign微服务调用组件使用

前言&#xff1a;OpenFeign是可以跨服务、跨进程的调用方式。 什么是Feign Feign是Netflix开发的声明式、模版化的HTTP客户端。 优势: Feign可以做到使用 HTTP 请求远程服务时就像调用本地方法一样的体验&#xff0c;开发者完全感知不到这是远程方法&#xff0c;更感知不到这…

【TB作品】stm32单片机读取DS2401程序

DS2401是由Analog Devices公司生产的一种硅序列号芯片&#xff0c;它提供了一个绝对唯一的64位ROM识别码&#xff0c;用于确保可追溯性。以下是对DS2401器件的分析&#xff1a; 特点和优势&#xff1a; 唯一性&#xff1a;每个DS2401芯片都有一个独一无二的64位注册码&#x…

PointPillars, CenterPoint,和TransFusion

PointPillars, CenterPoint, and TransFusion These models are primarily used for 3D object detection in autonomous driving. Here is a brief introduction to PointPillars, CenterPoint, and TransFusion: PointPillars 领域&#xff1a;计算机视觉&#xff0c;自动…