当前位置: 首页 > news >正文

@Autowired搭配@interface注解实现策略模式

应用场景:存在银行卡和社保卡的支付、退货等接口,接口报文中使用transWay表示银行卡(0)和社保卡(1),transType表示支付(1)、退货(2)。那么由其组合便能出现四个逻辑,所以要实现动态的逻辑分发。

domain

@Data
public class PosApiReq {/** 交易方式 **/private String transWay;/** 交易类型 **/private String transType;
}

service

  • 接口定义
public interface ICommonService {public Object handler(String json);
}
  • 银行卡消费
@Service
@CodeType("01")
public class BankConsumService implements ICommonService{@Overridepublic Object handler(String json) {System.out.println("银行卡消费开始:" + json);return "bank-consum";}
}
  • 银行卡退货
@Service
@CodeType("02")
public class BankRefundService implements ICommonService{@Overridepublic Object handler(String json) {System.out.println("银行卡退货开始:" + json);return "bank-refund";}
}
  • 社保卡消费
@Service
@CodeType("11")
public class SocConsumService implements ICommonService{@Overridepublic Object handler(String json) {System.out.println("社保卡消费开始:" + json);return "soc-consum";}
}
  • 社保卡退货
@Service
@CodeType("12")
public class SocRefundService implements ICommonService{@Overridepublic Object handler(String json) {System.out.println("社保卡退货开始:" + json);return "soc-refund";}
}

controller

@RestController
public class ServerController {private final Map<String, ICommonService> handlerMap = new HashMap<>();@Autowiredprivate void setHandler(List<ICommonService> commonServiceList) {for (ICommonService commonService : commonServiceList) {handlerMap.put(commonService.getClass().getAnnotation(CodeType.class).value(), commonService);}}@Anonymous@RequestMapping("/api")public Object api(@RequestBody PosApiReq posApiReq) {String transWay = posApiReq.getTransWay();String transType = posApiReq.getTransType();// 01 银行卡消费、02银行卡退货、11 社保卡消费、 12社保卡退货String value = transWay+transType;ICommonService commonService = handlerMap.get(value);Object object = commonService.handler(posApiReq.toString());return object;}
}

annotation

@Target(value={ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface CodeType {String value();
}

此方式完美的解决了根据不通交易调用不通逻辑的问题,如果新添加一类交易,只需要扩展实现ICommonService 接口的新类就可以。

相关文章:

@Autowired搭配@interface注解实现策略模式

应用场景&#xff1a;存在银行卡和社保卡的支付、退货等接口&#xff0c;接口报文中使用transWay表示银行卡&#xff08;0&#xff09;和社保卡&#xff08;1&#xff09;&#xff0c;transType表示支付&#xff08;1&#xff09;、退货&#xff08;2&#xff09;。那么由其组合…...

Linux CentOS下Composer简单使用

1.下载composer-setup.php cd /usr/local/src php -r “copy(‘https://install.phpcomposer.com/installer’, ‘composer-setup.php’);”2.安装composer php composer-setup.php3.设置全局composer cp composer.phar /usr/local/bin/composer4.设置国内镜像 composer co…...

Mysql-干净卸载教程

卸载 服务停掉 先把mysql服务停掉&#xff0c;如下点击右键&#xff0c;停止运行。 删除C盘内文件 接下来c盘里面的三个文件下的MySQL一一删除&#xff0c;需要注意的是 需要注意的是programdata文件下可能 隐藏了MySQL文件&#xff0c;所以可以在查看选项显示隐藏的文件。 …...

纵横字谜的答案 Crossword Answers

纵横字谜的答案 Crossword Answers - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 翻译后大概是&#xff1a; 有一个 r 行 c 列 (1<r,c<10) 的网格&#xff0c;黑格为 * &#xff0c;每个白格都填有一个字母。如果一个白格的左边相邻位置或者上边相邻位置没有白格&…...

cpp_04_类_对象_this指针_常对象_常(成员)函数

1 类 1.1 类的定义 类的作用是抽象事物&#xff08;抽取事物特征&#xff09;的规则。 类的外化表现是用户自定义的复合数据类型&#xff08;包括成员变量、成员函数&#xff09;&#xff1a; 成员变量用于表达事物的属性&#xff0c;成员函数用于表达事物的行为。 类的表现…...

AttributeError: module ‘_winapi‘ has no attribute ‘SYNCHRONIZE‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

多媒体互动橱窗设计如何改变内容展示形式?

橱窗设计在展品展示中扮演着举足轻重的角色&#xff0c;它相较于传统展示形式&#xff0c;能更直观地呈现展品效果&#xff0c;而且优质的橱窗设计还能提升品牌的产品形象&#xff0c;正因此&#xff0c;也被广泛应用于企业、博物馆、店铺等场所。随着多媒体技术的蓬勃发展和行…...

flutter自定义地图Marker完美展示图片

世人都说雪景美 寒风冻脚无人疼 只道是一身正气 结论 参考Flutter集成高德地图并添加自定义Maker先实现自定义Marker。如果自定义Marker中用到了图片&#xff0c;那么会碰到图片没有被绘制到Marker的问题&#xff0c;此时需要通过precacheImage来预加载图片&#xff0c;从而解…...

no module named cv2 、numpy 、xxx超全解决方案

常规解决方案可见博客&#xff1a; https://blog.csdn.net/ALiLiLiYa/article/details/126988014 案例 上述仍没有解决&#xff0c;可以参考如下进行&#xff1a; 例如&#xff1a;明明文件夹存在下述文件&#xff0c;仍然报错。那么可能缺少环境变量导致。 No module named …...

BSWM 模式管理(二)ESH

BSWM 模式管理 ESH 1 ECU State Handling (ESH)2 BSWM ESH 五大模式与六大通用状态机3 状态机对应的切换条件 conditions or rules4 默认主要的 ACTION 或者 ACTION LIST1 ECU State Handling (ESH) 与 ECUM 相关,整个 ECU 状态管理的状态机制 2 BSWM ESH 五大模式与六大通…...

mac电脑安装虚拟机教程

1、准备一台虚拟机&#xff0c;安装CentOS7 常用的虚拟化软件有两种&#xff1a; VirtualBoxVMware 这里我们使用VirtualBox来安装虚拟机&#xff0c;下载地址&#xff1a;Downloads – Oracle VM VirtualBox 001 点击安装 002 报错&#xff1a;he installer has detected an…...

手动配置 kafka 用户密码,认证方式等的方式

场景 部分场景会指定使用某一kafka 来提高安全性&#xff0c;这里就不得不使用用户密码认证方式等来控制 方法示例 // 手动加载配置信息private Map<String, Object> consumerConfigs() {Map<String, Object> props new HashMap<>();props.put(ConsumerCo…...

机器学习 深度学习 神经网络

神经网络概念&#xff1a; 神经网络是一个由生物神经元组成的网络或电路&#xff0c;或者从现代意义上讲&#xff0c;是一个由人工神经元或节点组成的人工神经网络。因此&#xff0c;一个神经网络要么是由生物神经元组成的生物神经网络&#xff0c;要么是用于解决人工智能&…...

VCG 获取某个顶点的邻接顶点

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 与之前的思路相同,这里我们利用VCG为我们提供的拓扑结构,获取某个顶点的邻接顶点,这在我们处理网格数据时往往很有用。 二、实现代码 //VCG #include <vcg/complex/algorithms/create/platonic.h> #inclu…...

四川云汇优想教育咨询有限公司电商服务靠谱吗

随着抖音电商的兴起&#xff0c;越来越多的商家开始关注这一领域。四川云汇优想教育咨询有限公司作为一家专注于电商服务的企业&#xff0c;也受到了广泛的关注。那么&#xff0c;四川云汇优想教育咨询有限公司的抖音电商服务靠谱吗&#xff1f;下面我们将从多个方面进行深入剖…...

Spring MVC框架支持RESTful,设计URL时可以使用{自定义名称}的占位符@Get(“/{id:[0-9]+}/delete“)

背景&#xff1a;在开发实践中&#xff0c;如果没有明确的规定URL&#xff0c;可以参考&#xff1a; 传统接口 获取数据列表,固定接口路径&#xff1a;/数据类型的复数 例如&#xff1a;/albums/select RESTful接口 - 根据ID获取某条数据&#xff1a;/数据类型的复数/{id} - 例…...

【GoLang】哪些大公司正在使用Go语言

你见过哪些令你膛目结舌的代码技巧&#xff1f; 文章目录 你见过哪些令你膛目结舌的代码技巧&#xff1f;前言&#xff1a;哪些大公司正在使用Go语言谷歌&#xff08;Google&#xff09;&#xff1a;脸书&#xff08;Facebook&#xff09;&#xff1a;亚马逊&#xff08;Amazon…...

美团外卖商超商品销量数据

美团外卖商超商品月销量 字段名 店铺id 店铺名称 商品id 商品名称 商品分类 规格名 原价 现价 月销 规格属性 描述 商品图片 含商家月销量...

【C++高阶(八)】单例模式特殊类的设计

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 单例模式 1. 前言2. 设计一个不能被拷贝/继承的…...

Linux之进程(五)(进程控制)

目录 一、进程创建 1、fork函数创建进程 2、fork函数的返回值 3、fork常规用法 4、fork调用失败的原因 二、进程终止 1、进程终止的方式 2、进程退出码 3、进程的退出方法 三、进程等待 1、进程等待的必要性 2、wait函数 3、waitpid函数 四、进程程序替换 1、概念…...

MyBatis-Plus中queryWrapper和lambdaQueryWrapper的eq方法实战对比:哪个更适合你的项目?

MyBatis-Plus中QueryWrapper与LambdaQueryWrapper的eq方法深度解析与实战选型指南 在Java持久层框架领域&#xff0c;MyBatis-Plus作为MyBatis的增强工具&#xff0c;其Wrapper条件构造器一直是开发者构建动态SQL的利器。其中eq方法作为最基础也是最常用的条件构造方法&#xf…...

终极Modbus测试工具:OpenModScan让工业通讯调试变得前所未有的简单

终极Modbus测试工具&#xff1a;OpenModScan让工业通讯调试变得前所未有的简单 【免费下载链接】OpenModScan Open ModScan is a Free Modbus Master (Client) Utility 项目地址: https://gitcode.com/gh_mirrors/op/OpenModScan 在工业自动化领域&#xff0c;Modbus协议…...

SDMatte API接口开发教程:基于Python Flask构建标准化服务

SDMatte API接口开发教程&#xff1a;基于Python Flask构建标准化服务 1. 开篇&#xff1a;为什么需要API接口 如果你用过SDMatte这个强大的图像抠图工具&#xff0c;可能会遇到这样的场景&#xff1a;想把抠图功能集成到自己的应用里&#xff0c;或者需要批量处理大量图片。…...

别再死磕公式了!用Ansoft Maxwell 2D给永磁无刷电机做仿真,保姆级操作流程(附避坑点)

永磁无刷电机仿真实战&#xff1a;从零掌握Ansoft Maxwell 2D的高效工作流 第一次打开Ansoft Maxwell 2D时&#xff0c;满屏的专业术语和复杂的参数设置界面确实容易让人望而生畏。作为从业十年的电机设计工程师&#xff0c;我完全理解这种面对专业仿真软件时的无力感——理论书…...

免费领取《MapleSim卷材加工和卷绕系统建模仿真教程》

在薄膜、纸张、电池极片、电子材料等卷对卷加工中&#xff0c;你是否还在为张力波动、卷材打滑、收放卷不稳而头疼&#xff1f;物理样机调试成本高、风险大&#xff0c;单纯依靠经验难以解决复杂的动态耦合问题。 Maplesoft 中国技术团队近期发布了 MapleSim 卷材处理库&#…...

告别手动切割:Pixelorama智能精灵图处理方案

告别手动切割&#xff1a;Pixelorama智能精灵图处理方案 【免费下载链接】Pixelorama A free & open-source 2D sprite editor, made with the Godot Engine! Available on Windows, Linux, macOS and the Web! 项目地址: https://gitcode.com/gh_mirrors/pi/Pixelorama …...

5大突破性功能:重新定义Mac微信体验的终极指南

5大突破性功能&#xff1a;重新定义Mac微信体验的终极指南 【免费下载链接】WeChatExtension-ForMac Mac微信功能拓展/微信插件/微信小助手(A plugin for Mac WeChat) 项目地址: https://gitcode.com/gh_mirrors/we/WeChatExtension-ForMac 你是否曾因微信消息被撤回而错…...

Degrees of Lewdity中文本地化终极指南:从零开始畅玩完整汉化版

Degrees of Lewdity中文本地化终极指南&#xff1a;从零开始畅玩完整汉化版 【免费下载链接】Degrees-of-Lewdity-Chinese-Localization Degrees of Lewdity 游戏的授权中文社区本地化版本 项目地址: https://gitcode.com/gh_mirrors/de/Degrees-of-Lewdity-Chinese-Localiza…...

会Python可以找什么工作?

Python凭借简洁易用、功能强大的特点&#xff0c;成为当下就业面极广的编程语言。不少人学会后却不清楚可以找什么工作&#xff0c;其实从开发、数据分析到自动化运维都有大量机会&#xff0c;接下来为大家详细讲解一下。会Python后&#xff0c;可以找的工作有很多&#xff0c;…...

FPGA实战:增量式编码器信号处理与高精度位置解算

1. 增量式编码器在工业控制中的核心作用 增量式编码器就像工业设备的"眼睛"&#xff0c;它能精确捕捉旋转物体的位置和速度信息。在数控机床、机械臂、伺服电机等设备中&#xff0c;编码器的精度直接决定了整个系统的控制质量。我做过一个伺服电机项目&#xff0c;编…...