springboot 抽出多个接口中都有相同的代码的方法

在Spring Boot中,如果发现多个接口中有重复的代码,可以采用以下几种方式来提取和复用这段代码:

1、使用Service层方法

        如果这段代码的逻辑与业务相关,可以将其封装到一个Service层的方法中,然后在Controller中调用这个方法。

   // SysConfigService.javapublic SysConfig findServerUrlConfig() {SysConfig sysConfig = this.findSysConfigByConfigKey("server_url");if (sysConfig == null) {throw new ConfigNotFoundException("服务地址配置信息为空");}return sysConfig;}// Controller.java@GetMapping("/endpoint")public HttpResponseDto getEndpoint() {SysConfig sysConfig = sysConfigService.findServerUrlConfig();String serverUrl = sysConfig.getConfigValue();// 使用serverUrl ...}

2、使用Controller Advice

        如果这段代码是与Controller相关的,比如预处理请求或后处理响应,可以使用@ControllerAdvice来创建一个全局的拦截器或处理器。

   @ControllerAdvicepublic class GlobalControllerAdvice {@ModelAttributepublic void addServerUrl(Model model) {SysConfig sysConfig = sysConfigService.findSysConfigByConfigKey("server_url");if (sysConfig == null) {throw new ConfigNotFoundException("服务地址配置信息为空");}model.addAttribute("serverUrl", sysConfig.getConfigValue());}}

然后在Controller中使用@ModelAttribute的值:

   @GetMapping("/endpoint")public HttpResponseDto getEndpoint(@ModelAttribute("serverUrl") String serverUrl) {// 使用serverUrl...}

3、使用AspectJ切面

        如果这段代码是横切关注点,可以使用AspectJ切面来封装这段逻辑。

   @Aspect@Componentpublic class ServerUrlAspect {@Before("execution(* com.example.controller.*.*(..))")public void before(JoinPoint joinPoint) {SysConfig sysConfig = sysConfigService.findSysConfigByConfigKey("server_url");if (sysConfig == null) {throw new ConfigNotFoundException("服务地址配置信息为空");}// 可以通过某种方式将sysConfig或其值传递给被切的方法}}

4、使用自定义注解和处理器

        如果这段代码只适用于特定的场景,可以创建一个自定义注解和对应的处理器来处理这段逻辑。

   @Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface LoadServerUrl {}@LoadServerUrl@GetMapping("/endpoint")public HttpResponseDto getEndpoint() {// 在这里使用serverUrl}

        处理器:

   @Aspect@Componentpublic class LoadServerUrlAspect {@Around("@annotation(LoadServerUrl)")public Object loadServerUrl(ProceedingJoinPoint joinPoint) throws Throwable {SysConfig sysConfig = sysConfigService.findSysConfigByConfigKey("server_url");if (sysConfig == null) {throw new ConfigNotFoundException("服务地址配置信息为空");}// 可以通过某种方式将sysConfig或其值传递给被切的方法return joinPoint.proceed();}}

如果是纯粹的业务逻辑,推荐使用Service层方法;

如果是与请求处理紧密相关的逻辑,可以考虑使用@ControllerAdvice或自定义注解;

如果是横切关注点,使用AspectJ切面是最佳选择。

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

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

相关文章

electron实现右键菜单保存图片功能

1.创建窗口,加载页面,代码如下: //打开窗口const {ipcMain, BrowserWindow} require("electron") const saveImage require("../ipcMain/saveImage") let win null; ipcMain.handle(on-open-event, (event, args) &g…

数字信号处理及MATLAB仿真(5)——z变换

采样的其他概念咱们后面再慢慢的讲述吧,先把z变换的程序给大家展示一下,总的来说呢,就用一个函数——ztran就行了。在 MATLAB 中,可以使用 ztrans 函数来进行 Z 变换。ztrans 函数用于对离散时间信号或系统进行 Z 变换&#xff0c…

点云处理实操 基于多项式重构的平滑和法线估计

目录 基于多项式重构的平滑和法线估计 一、什么是移动最小二乘法(Moving Least Squares, MLS) 二、算法原理 三、算法应用 四、PCL代码实践 基于多项式重构的平滑和法线估计 原文地址:Smoothing and normal estimation based on polynomial reconstruction — Point Cl…

mysql中select语句的执行顺序

执行顺序是什么? Form 这一阶段读取表的数据,并准备执行后续的操作。如果有多表连接,这一步也会涉及连接操作(INNER JOIN、LEFT JOIN、RIGHT JOIN、CROSS JOIN 等)。 ON 在进行表连接时,使用 ON 关键字指…

C++入门 模仿mysql控制台输出表格

一、 说明 控制台输出表格&#xff0c;自适应宽度 二、 源码 #include <iostream> #include <map> #include <string> #include <vector>using namespace std;void printTable(vector<vector<string>> *pTableData) {int row pTableDa…

VS2022 git拉取/推送代码错误

第一步&#xff1a;打开VS2022 第二步&#xff1a;工具->选项->源代码管理->Git 全局设置 第三步&#xff1a;加密网络提供程序设置为&#xff1a;OpenSSL 完结&#xff1a;

Solana开发之Anchor框架

文章目录 Solana开发之Anchor框架一、什么是Anchor二、安装和使用1. 安装rust2. 安装Solana下载预构建的二进制文件 3. 使用 Anchor 版本管理器 &#xff08;avm&#xff09; 进行安装&#xff08;推荐&#xff09; 四、Anchor 核心原理Anchor 程序由三部分组成程序的 ID 从哪里…

基于java+springboot+vue实现的大学城水电管理系统(文末源码+Lw)106

基于SpringBootVue的实现的大学城水电管理系统&#xff08;源码数据库万字Lun文流程图ER图结构图演示视频软件包&#xff09; 系统功能&#xff1a; 本大学城水电管理系统 管理员功能有个人中心&#xff0c;用户管理&#xff0c;领用设备管理&#xff0c;消耗设备管理&#x…

AV1编码标准中块分区技术详细说明

libaom 开放媒体联盟视频1&#xff08;AV1&#xff09;编解码器的框架基于一种混合视频编码结构&#xff0c;由几个主要的功能模块组成&#xff0c;如预测、变换、量化、熵编码和环路滤波。每个功能模块使用特定类型的视频编码技术处理输入数据&#xff0c;其输出被送入另一个功…

科研绘图系列:R语言金字塔图(pyramid plot)

介绍 金字塔图(Pyramid chart)是一种用于展示人口统计数据的图表,特别是用于展示不同年龄段的人口数量。这种图表通常用于展示人口结构,比如性别和年龄的分布。 特点: 年龄分层:金字塔图按年龄分层,每一层代表一个年龄组。性别区分:通常,男性和女性的数据会被分别展…

FiddlerScript Rules修改-更改发包中的cookie

直接在fiddler script editor中增加如下处理代码即可 推荐文档oSession -- 参数说明 测试笔记 看云

fork的理解

一. 注意点 1.进程是并发的&#xff0c;主进程和子进程同时进行&#xff0c;效率高2.子进程产生时是完全复制主进程的状态的&#xff0c;只有在产生修改的时候才会单独分配资源。 二. 下面程序一共应该为8个进程&#xff0c;但code的终端看到只有7个进程号的原因。因为fork返…

FastAPI 学习之路(四十一)定制返回Response

接口中返回xml格式内容 from fastapi import FastAPI, Responseapp FastAPI()# ① xml app.get("/legacy") def get_legacy_data():data """<?xml version"1.0"?><shampoo><Header>Apply shampoo here.</Header&…

【Linux】管道命令

命令执行的时候有时会输出数据&#xff0c;有的命令输出的数据太繁杂了。 那么我们怎么去筛选这些信息来得到我们所想要的格式&#xff1f; 这就牵涉到管道命令的问题了&#xff08;pipe&#xff09;&#xff0c;管道命令使用的是【|】这个界定符号。另外&#xff0c;管道命令与…

centos 安装ffmpeg

这个错误表明在你的 CentOS 系统的默认仓库中没有 ffmpeg 包。CentOS 的默认仓库通常不包含 ffmpeg&#xff0c;因为它涉及一些许可证问题。但是&#xff0c;你可以通过添加第三方仓库来安装 ffmpeg。 使用 EPEL 和 RPM Fusion 仓库 # 安装 EPEL 仓库 sudo yum install epel-…

编程师适合看什么书:深入探索编程领域的知识宝库

编程师适合看什么书&#xff1a;深入探索编程领域的知识宝库 在编程领域&#xff0c;不断学习是提升技能的关键。选择合适的书籍&#xff0c;对于编程师来说&#xff0c;不仅能够拓宽视野&#xff0c;还能深入掌握各种技术细节。那么&#xff0c;编程师适合看什么书呢&#xf…

引用常用用法

1. 通过传递引用&#xff0c;修改原始变量的值 struct UpdateItem { std::string id; // Unique identifier for the record std::string userId; // Users ID std::string userName; // Users name std::string userDept; // Users department }; int getmessade() { std::ve…

ES6 async 函数详解 (十)

async 函数是什么&#xff1f;一句话&#xff0c;它就是 Generator 函数的语法糖。 const gen function* () {const f1 yield readFile(/etc/fstab);const f2 yield readFile(/etc/shells);console.log(f1.toString());console.log(f2.toString()); };const asyncReadFile …

项目管理工具评测:2024年国内外最顶级的10款项目管理工具排行

国内外涌现出众多优秀的项目管理工具&#xff0c;它们各自在功能、易用性、集成能力等方面展现出独特优势。以下是国内外顶级的10款项目管理工具&#xff1a; 一、进度猫 推荐理由&#xff1a;进度猫以其直观的任务管理和进度跟踪功能&#xff0c;成为许多团队和项目的首选…

MybatisPlus 使用教程

MyBatisPlus使用教程 文章目录 MyBatisPlus使用教程1、使用方式1.1 引入依赖1.2 构建mapper接口 2、常用注解2.1 TableName2.2 TableId2.3 TableField MyBatisPlus顾名思义便是对MyBatis的加强版&#xff0c;但两者本身并不冲突(只做增强不做改变)&#xff1a; 引入它并不会对原…