1. 用两种方式在springboot项目中实现适配器模式

文章目录

  • 用两种方式在springboot项目中实现适配器模式
    • 1. 场景
    • 2. 方式1,通过实现类定义类型字段实现
      • 2.1 创建接口
      • 2.2 创建mysql实现类
      • 2.3 创建oracle实现类
      • 2.4 创建接口,在接口中注入service集合,根据每个实现类中定义的dbType进行匹配后进行调用
      • 2.5 测试,浏览器输入
    • 3. 方式2,以动态service名称的方式实现
      • 3.1 创建接口
      • 3.2 创建创建mysql实现类,定义实现类名称为mysqlDbService
      • 3.3 创建创建oracle实现类,定义实现类名称为oracleDbService
      • 3.4 引入ApplicationContext,获取service方法名
      • 3.5 调用接口,通过ApplicationContextHelper根据service名称动态获取实现类,调用方法
      • 3.6 测试

用两种方式在springboot项目中实现适配器模式

1. 场景

当我们后台有两个数据库,分别为mysql和oracle,根据前端参数中的数据库类型字段,去查询对应sql语句

2. 方式1,通过实现类定义类型字段实现

2.1 创建接口

public interface DbService {/*** 获取数据库类型* @return*/String getDbType();/*** 查询数据库sql* @return*/String getDbSql();
}

2.2 创建mysql实现类

@Service
public class MysqlDbService implements DbService{@Overridepublic String getDbType() {return "mysql";}@Overridepublic String getDbSql() {return "获取mysql的SQL";}
}

2.3 创建oracle实现类

@Service
public class OracleSDbService implements DbService{@Overridepublic String getDbType() {return "oracle";}@Overridepublic String getDbSql() {return "获取oracle的SQL";}
}

2.4 创建接口,在接口中注入service集合,根据每个实现类中定义的dbType进行匹配后进行调用

@RestController
@RequestMapping("/test")
public class TestController {@Resourceprivate List<DbService> dbServiceList;@GetMapping("/getDbSql1")public String getDbSql(@RequestParam String dbtype){DbService dbService = dbServiceList.stream().filter(item -> dbtype.equals(item.getDbType())).findFirst().get();return dbService.getDbSql();}}

2.5 测试,浏览器输入

在这里插入图片描述

3. 方式2,以动态service名称的方式实现

3.1 创建接口

public interface DbService {/*** 获取数据库类型* @return*/String getDbType();/*** 查询数据库sql* @return*/String getDbSql();
}

3.2 创建创建mysql实现类,定义实现类名称为mysqlDbService

@Service(value = "mysqlDbService")
public class MysqlDbService implements DbService{@Overridepublic String getDbType() {return "mysql";}@Overridepublic String getDbSql() {return "获取mysql的SQL";}
}

3.3 创建创建oracle实现类,定义实现类名称为oracleDbService

@Service(value = "oracleDbService")
public class OracleSDbService implements DbService{@Overridepublic String getDbType() {return "oracle";}@Overridepublic String getDbSql() {return "获取oracle的SQL";}
}

3.4 引入ApplicationContext,获取service方法名

@Component("applicationContextHelper")
public class ApplicationContextHelper implements ApplicationContextAware {private static ApplicationContext applicationContext;public static <T> T popBean(String name, Class<T> clazz) {if (applicationContext == null) {return null;}return applicationContext.getBean(name, clazz);}@Overridepublic void setApplicationContext(ApplicationContext context) throws BeansException {applicationContext = context;}public ApplicationContext getInstance() {return applicationContext;}
}

3.5 调用接口,通过ApplicationContextHelper根据service名称动态获取实现类,调用方法

@RestController
@RequestMapping("/test")
public class TestController {@Resourceprivate List<DbService> dbServiceList;@GetMapping("/getDbSql2")public String getDbSql2(@RequestParam String dbtype){DbService dbService = ApplicationContextHelper.popBean(dbtype + "DbService", DbService.class);return dbService.getDbSql();}
}

3.6 测试

在这里插入图片描述

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

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

相关文章

幼猫咬不动猫粮该怎么办?

亲爱的猫友们&#xff0c;遇到幼猫咬不动猫粮的情况&#xff0c;是不是很让人着急呢&#xff1f;别担心&#xff0c;让我们一起来探讨一下解决这个问题的方法。&#x1f431;&#x1f35a; 首先&#xff0c;我们得理解幼猫的牙齿和消化系统发育还不够成熟&#xff0c;所以咬不动…

算法刷题day30:递归

目录 引言一、有序分数二、正则问题三、带分数四、约数之和 引言 本篇文章主要讲了递归的一些题型&#xff0c;递归也是一种思想&#xff0c;主要是在各种题中显现这种思想&#xff0c;你必须要脑子里能够清楚它大概的一种路线是怎样的&#xff0c;或者说要抽象出来它的功能是…

Arduino ESP8266 SSD1306 硬件I2C+LittleFS存储GBK字库实现中文显示

Arduino ESP8266 SSD1306 硬件I2C+LittleFS存储GBK字库实现中文显示 📍相关篇《Arduino esp8266 软件I2C SSD1306 +LittleFS存储GBK字库实现中文显示》 🌼显示效果: ✨将部分函数重构,和上面相关篇的软件I2C通讯相关接口函数移植过来,除了汉字显示采用自己写的API函数外…

使用 ReclaiMe Pro 恢复任意文件系统(Win/Linux/MacOS)

天津鸿萌科贸发展有限公司是 ReclaiMe Pro 数据恢复软件授权代理商。 ReclaiMe Pro 是一个通用工具包&#xff0c;几乎可以用于从所有文件系统&#xff08;从 Windows 系列文件系统、Linux 和 MacOS&#xff09;中恢复数据。此外&#xff0c;考虑到数据恢复工作的具体情况&…

如何实现Git Push之后自动部署到服务器?

在平时个人开发的过程中是不是有这样的烦恼&#xff1a; 项目开发完成&#xff0c;Push之后 登录服务器&#xff0c;手动git pull&#xff0c;然后运行部署命令 这真的很烦诶&#xff01; 那么能不能Git push之后&#xff0c;远端服务器自动 Git pull 然后运行部署命令呢&a…

2023行政区域

几乎所有业务系统&#xff0c;都会涉及行政区域。国家统计局 官网上公开了所有的区域编码&#xff0c;一年一更新。但只能在线查看&#xff0c;没有提供完整数据库下载的连接。为此&#xff0c;我编写了一个简陋的 python 脚本&#xff0c;抓取了近几年的数据&#xff0c;供大家…

ctf杂项总结

1.文件无法打开 1.1.文件拓展名损坏/错误导致 方法&#xff1a; 1.使用kali当中的file命令查看&#xff0c;之后修改为正确的后缀即可 2.通过16进制编辑器打开查看文件头 3.文件头残缺/错误&#xff0c;可以先使用kail当中的file命令查看它的类型&#xff0c;之后再通过 16…

C# EPPlus导出dataset----Excel2绘制图像

一、生成折线图方法 /// <summary> ///生成折线图 /// </summary> /// <param name="worksheet">sheet页数据 </param> /// <param name="colcount">总列数</param> /// &l…

(每日持续更新)jdk api之StreamCorruptedException基础、应用、实战

博主18年的互联网软件开发经验&#xff0c;从一名程序员小白逐步成为了一名架构师&#xff0c;我想通过平台将经验分享给大家&#xff0c;因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验&#xff0c;晚上进行用心精简、整理、总结、定稿&…

vue-vben-admin的编译运行

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 更多nbcio-boot功能请看演示系统RuoYi-Nbcio亿事达企业管理平台 gitee源代码地址 后端代码&#xff1a;…

变量的本质和命名规则

变量的本质 内存:计算机中存储数据的地方&#xff0c;相当于一个空间变量本质:是程序在内存中申请的一块用来存放数据的小空间 变量命名规则与规范 规则: 不能用关键字 关键字:有特殊含义的字符&#xff0c;JavaScript 内置的一些英语词汇。例如:let、var、if、for等>只…

Jenkins入门指南:自动化构建与部署的艺术

概要&#xff1a; 本篇博客旨在为新手提供一个全面、易懂的Jenkins入门指南。我们将从Jenkins的基本概念讲起&#xff0c;逐步深入到安装、配置、以及如何使用Jenkins来自动化软件的构建、测试和部署过程。内容将涉及Jenkins的核心功能&#xff0c;插件管理&#xff0c;以及与…

代码随想录-动态规划7(139. 单词拆分)

139. 单词拆分 class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {vector<bool> dp(s.size()1, false);unordered_set<string> wordDict_set;for (int i0; i<wordDict.size(); i){wordDict_set.insert(wordDict[i]);}dp…

掌握AI技术,轻松学习游戏开发

进入游戏开发的世界&#xff0c;就像打开了一扇通往未来的大门&#xff0c;而掌握AI技术正是这扇门的钥匙。随着AI技术在游戏行业的迅速崛起&#xff0c;它不仅为游戏设计和用户体验带来了革命性的改变&#xff0c;更为新入行者展示了一个充满创新和机遇的领域。特别是百川智能…

HTML CSS学习

# html css 日常学习记录---学习途径--渡一教育-袁老师# 元素包含关系 以前&#xff1a;块级元素可以包含行级元素&#xff0c;行级元素不可以包含块级元素&#xff0c;a元素除外 元素的包含关系由元素的内容类别决定。 例如&#xff0c;查看h1元素中是否可以包含p元素 总…

缓存把我坑惨了..

故事 春天&#xff0c;办公室外的世界总是让人神往的&#xff0c;小猫带着耳机&#xff0c;托着腮帮&#xff0c;望着外面美好的春光神游着… 一声不和谐的座机电话声打破这份本该属于小猫的宁静&#xff0c;“hi&#xff0c;小猫&#xff0c;线上有个客户想购买A产品规格的商…

SOLIDWORKS2024 | 轻松处理制造复杂几何体和有机形状

如今&#xff0c;工程师面临各种各样的挑战。预算紧缩的同时&#xff0c;排期也越来越短。客户需要智能、互联的产品&#xff0c;这一需求掀起了各行各业添加软件和电子模块的趋势。产品须变得更快、更轻、更好。在所有这些变化中&#xff0c;几何体也变得越来越复杂。 从工作…

InstantID Zero-shot Identity-Preserving Generation in Seconds

InstantID: Zero-shot Identity-Preserving Generation in Seconds TL; DR&#xff1a;InstantID IP-Adapter (Face) ControlNet&#xff0c;实现了具有较高保真度的人脸 ID 生成。 方法 InstantID 想做到的事情是&#xff1a;给定一张参考人脸 ID 图片&#xff0c;生成该…

基于单片机的电子秤设计

摘 要 本文设计了一种以51单片机来进行控制的电子秤系统&#xff0c;系统的电路部分由以下几个电路模块组成&#xff1a;数据采集和数据处理电路、模数转换电路、LED及蜂鸣器报警电路、最小系统电路、液晶显示电路、矩阵按键电路等。接通电源后&#xff0c;单片机会把压力传感…

DeepSeek发布多模态大型语言模型DeepSeek-VL,技术创新性突出

近日,DeepSeek团队发布了一项创新性突出的多模态大型语言模型DeepSeek-VL。该模型参数规模为1.3B和6.7B,采用了创新的联合视觉和语言预训练方法,旨在解决传统的单模态预训练方法的局限性。 DeepSeek-VL在数据准备、模型架构和训练方法等多方面都有创新工作。在数据准备方面,采用…