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

news2024/11/15 11:16:01

文章目录

  • 用两种方式在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{

    @Override
    public String getDbType() {
        return "mysql";
    }

    @Override
    public String getDbSql() {
        return "获取mysql的SQL";
    }
}

2.3 创建oracle实现类

@Service
public class OracleSDbService implements DbService{

    @Override
    public String getDbType() {
        return "oracle";
    }

    @Override
    public String getDbSql() {
        return "获取oracle的SQL";
    }
}

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

@RestController
@RequestMapping("/test")
public class TestController {

    @Resource
    private 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{

    @Override
    public String getDbType() {
        return "mysql";
    }

    @Override
    public String getDbSql() {
        return "获取mysql的SQL";
    }
}

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

@Service(value = "oracleDbService")
public class OracleSDbService implements DbService{

    @Override
    public String getDbType() {
        return "oracle";
    }

    @Override
    public 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);
    }

    @Override
    public void setApplicationContext(ApplicationContext context) throws BeansException {
        applicationContext = context;
    }

    public ApplicationContext getInstance() {
        return applicationContext;
    }
}

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

@RestController
@RequestMapping("/test")
public class TestController {

    @Resource
    private 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.coloradmin.cn/o/1515968.html

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

相关文章

个人博客系列-后端项目-用户注册功能(7)

介绍 用户注册API的主要流程&#xff1a;1.前端用户提交用户名&#xff0c;密码 2. 序列化器校验用户名&#xff0c;密码是否合法。3.存入数据库。4.签发token 创建序列化器 from rest_framework import serializers from rest_framework_simplejwt.serializers import Toke…

harmonyOS简介及背景

harmonyOS的场景模式18n: 1&#xff08;入口手机&#xff09;8&#xff08;电脑、VR、手环、iPad、智慧屏、&#xff09;–wifi—n(车载、智能家居等所有)harmonyOS不需要考虑软硬件的差异&#xff0c;是一个兼容N种的超级终端harmonyOS干了两件事&#xff1a; &#xff08;1&a…

前端项目,个人笔记(一)【定制化主题 + 路由设计】

目录 1、项目准备 1.1、项目初始化 1.2、elementPlus按需引入 注&#xff1a;使用cnpm安装elementplus及两个插件&#xff0c;会报错&#xff1a;vueelement-plus报错TypeError: Cannot read properties of null (reading isCE ) &#xff0c;修改&#xff1a; 测试&#…

[Redis]——Redis持久化的两种方式RDB、AOF

目录 RDB快照模式 概念&#xff1a; 触发时机&#xff1a; 异步做快照 AOF追加模式 概念&#xff1a; 触发时机&#xff1a; bgrewriteaof命令&#xff1a; 比较两种模式&#xff1a; RDB快照模式 概念&#xff1a; RDB模式就是保存当前Redis的状态到本地磁盘文件&am…

阿里云服务器ECS--安全,稳定,购买灵活,低成本

阿里云服务器ECS英文全程Elastic Compute Service&#xff0c;云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务&#xff0c;阿里云提供多种云服务器ECS实例规格&#xff0c;如ECS经济型e实例、通用算力型u1、ECS计算型c7、通用型g7、GPU实例等&#xff0c;阿里云服务器网al…

【Redis】Redis常用命令一

1.keys&#xff1a;返回所有满足条件的key&#xff0c;比如&#xff1a; KEYS pattern时间复杂度&#xff1a;O(N)&#xff0c;返回值&#xff1a;匹配pattern的所有key。 • h?llo 匹配 hello , hallo 和 hxllo • h*llo 匹配 hllo 和 heeeello • h[ae]llo 匹配 hello 和 …

Java基于微信小程序的校园生活互助小助手

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

算法时空复杂度分析:大O表示法

文章目录 前言大O表示法3个时间复杂度分析原则常见的时间复杂度量级空间复杂度参考资料 前言 算法题写完以后&#xff0c;面试官经常会追问一下你这个算法的时空复杂度是多少&#xff1f;&#xff08;好像作为一名算法工程师&#xff0c;我日常码代码的过程中&#xff0c;并没…

Codeforces Round 931 (Div. 2)题解

A. Too Min Too Max&#xff08;Problem - A - Codeforces&#xff09; 题目大意&#xff1a;给定一个数组a[],从中找到4个下标i,j,k,l,求|ai-aj||aj-ak||ak-al||al-ai|的最大值。 思路&#xff1a;显然随便找四个下标与顺序无关&#xff0c;那么我们可以先将a[]排序。那么实…

CSS:实现择色器透明度条的两种方法(附赠一个在线图片转base64网站)

一、效果展示 二、实现方式 1.锥形渐变 .main{width: 600px;height: 20px;background: repeating-conic-gradient(rgba(1, 1, 1, 0.1) 0 25%,transparent 0 50%);background-size: 20px 20px;} 2.背景图 将一个四方格图片转为base64然后直接在css中使用 .main1 {width: 600p…

Sectigo通配符

Sectigo通配符SSL证书是一种特别设计的数字证书解决方案&#xff0c;尤其适合拥有大量子域名的企业或组织。通过使用通配符“*”字符&#xff0c;这种证书可以一次性加密并验证一个主域名以及该主域名下的任意数量的子域名。比如&#xff0c;如果你拥有example.com作为主域名&a…

如何通过libusb直接向zebra打印机发送zpl,跨平台win/linux

环境&#xff1a;windows & linux & Zebra打印机gt820 windows: 之前安装了Zebra打印机官方驱动&#xff0c;所以先卸载掉驱动。再安装Zadig&#xff0c;用Zadig工具来安装WinUSB驱动。 zadig下载&#xff1a;Zadig - USB driver installation made easy 记住这两个数…

一站式数据采集物联网平台:智能化解决方案,让数据管理更高效、更安全

JVS物联网平台的定位 JVS是企业信息化的“一站式解决方案”&#xff0c;其中包括了基础的数字化底座、各种企业级能力、企业内常见的应用&#xff0c;如下图所示&#xff1a; 整体平台能力层有三大基础能力&#xff1a; 低代码用于业务的定义;数据分析套件用于数据的自助式分…

蓝桥杯专题 bfs习题详解

1.离开中山路 #include<iostream> #include<cstring> #include<queue> #include<algorithm> #include<string> using namespace std; int x1,x2,y1,y2; int n,n1,m1; const int N1010;typedef pair<int,int> PII; queue<PII> q;int …

一站式解决方案:uni-app条件编译及多环境配置,appid动态修改攻略!

前言 这篇文章主要介绍uniapp在Hbuilderx 中&#xff0c;通过工程化&#xff0c;区分不同环境、动态修改小程序appid以及自定义条件编译&#xff0c;解决代码发布和运行时手动切换到问题。 背景 在企业级的应用中&#xff0c;通常会分为&#xff0c;开发、联调、生产等多个环…

探索谷歌的秘密花园:Google文件系统GFS之旅(Google File System)

文章目录 &#x1f3d8;️GFS系统架构GFS系统节点类型GFS实现机制 &#x1f34e;GFS特点采用中心服务器模式不缓存数据在用户态下实现只提供专用接口 容错机制⚒️Master容错机制&#x1f504; Chunk Server容错 &#x1f6e0; 系统管理技术 &#x1f3d8;️GFS系统架构 大型分…

SSM整合项目(添加家居)

文章目录 1.需求分析2.设计结构3.编写Service层1.创建文件夹2.FurnService.java3.FurnServiceImpl.java4.单元测试 FurnServiceTest.java5.指定默认图片位置1.Furn.java 为imgPath设置默认值2.Furn.java 的全参构造器内判断imgPath是否为空 4.返回json数据的通用类com/sun/furn…

FreeRTOS操作系统学习——调试与优化

本文介绍 在FreeRTOS中&#xff0c;我们经常会运用到栈这个技术&#xff0c;我们对某个任务分配空间时&#xff0c;往往不确定分配多大空间的栈。任务拿到分配的栈后&#xff0c;大多数情况下&#xff0c;使用率都达不到80%&#xff0c;为了节省栈空间的开销&#xff0c;我们可…

k8s部署InfluxDB

&#xff08;作者&#xff1a;陈玓玏&#xff09; 1. 拉取镜像 docker pull influxdb #拉取镜像 docker run -d influxdb:latest #后台运行容器 docker exec -it 89b /bin/bash #进入容器&#xff0c;89b是容器ID的前三位 cd /usr/bin #进入容器后&#xff0c;进入此文件夹…

GNN/GCN自己学习

一、图的基本组成 V&#xff1a;点&#xff08;特征&#xff09; E&#xff1a;边 U&#xff1a;图&#xff08;全局特征&#xff09; 二、用途 整合特征&#xff08;embedding)&#xff0c;做重构 三、邻接矩阵 以图像为例&#xff0c;每个像素点周围都有邻居&#xff0c;…