定制你的【Spring Boot Starter】,加速开发效率

摘要: 本文将介绍如何创建一个自定义的 Spring Boot Starter,让您可以封装常用功能和配置,并在多个 Spring Boot 项目中共享和重用。

1. 简介

Spring Boot Starter 是 Spring Boot 框架中的一种特殊的依赖项,它用于快速启动和配置特定功能的应用程序。Starter 实际上是一个 Maven 或 Gradle 项目,它包含了一组预配置的依赖项、默认的配置信息和自动配置类,以帮助开发者快速集成和使用某项功能。

Spring Boot Starter 通常命名为 spring-boot-starter-*,例如 spring-boot-starter-web 用于启动基本的Web应用程序,spring-boot-starter-data-jpa 用于启动使用JPA的数据访问应用程序。

2.背景

在企业微服务开发中,每个微服务模块可能会有不同的异常处理和错误信息输出方式,这样会导致系统的一致性和可维护性下降。为了解决这个问题,您希望创建一个自定义的 Spring Boot Starter,用于统一处理异常和错误信息,并提供一致的错误响应格式。

3.需求

  1. 统一的异常处理:对于常见的异常类型(如 404、500),提供统一的异常处理方式,并返回一致的错误响应。

  2. 统一的错误响应格式:定义一致的错误响应格式,包括错误代码、错误消息、错误详情等信息。

  3. 可定制化:允许开发人员根据实际情况定制异常处理和错误响应的方式,以满足不同的业务需求。

4.实现

4.1.创建SpringBoot项目

创建完成后项目结构

4.2.添加相关依赖

这里需要注意的是,在build.gradle文件中,我们在这里引入了  id 'java-library'

plugins {id 'java'// 添加 maven-publish 插件 主要是为了发布项目到 Maven 仓库id 'maven-publish'// 应用 Java Library 插件,提供 Java 项目的基本构建功能id 'java-library'}group = 'org.sys_my_start'
version = '1.0-SNAPSHOT'
ext {springfoxVersion = '3.2.2'
}// 配置发布任务
publishing {// 定义发布内容publications {// 定义一个 MavenPublication 类型的发布mavenJava(MavenPublication) {// 发布内容来源于 Java 组件from components.java// 定义 Maven 坐标信息groupId 'org.sys_my_start' // Maven 项目的组织或公司标识artifactId 'com_sys_my_start' // 项目在 Maven 仓库中的唯一标识version '1.0-SNAPSHOT' // 项目的版本号,表示开发中的版本}}
}repositories {mavenCentral()
}/*  api: 这个依赖声明范围表示该依赖项不仅仅对当前项目的编译和运行时可见,而且对于其他依赖于当前项目的项目也是可见的。换句话说,当一个项目依赖于当前项目时,它也将自动获得该依赖项。(也就是最外层的可以访问最内层所引入的依赖)上面引入这个 也是为了使用api 因为 gradle 7.0 以后默认不支持 compile语法了废弃了,所以我们这里需要使用apiid 'java-library'
*/
dependencies {api "org.springframework.boot:spring-boot-starter-web:$springfoxVersion"
}test {useJUnitPlatform()
}

4.3.编写Starter 主要逻辑

4.3.1.编写异常处理类

package com.sys.my.start.exception;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;@ControllerAdvice
public class GlobalExceptionHandler {private final ExceptionHandlerProperties properties;@Autowiredpublic GlobalExceptionHandler(ExceptionHandlerProperties properties) {this.properties = properties;}/*** 处理自定义异常* @param ex 自定义异常* @param request 请求* @return ResponseEntity 返回异常信息*/@ExceptionHandler(Exception.class)public ResponseEntity<ErrorResponse> handleAnyException(Exception ex, WebRequest request) {if (properties.isEnabled()) {// 处理自定义异常, 返回异常信息ErrorResponse errorResponse = new ErrorResponse("500", ex.getMessage(), request.getDescription(false));return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);} else {// 未启用全局异常处理 返回500return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);}}
}

4.3.2.编写错误响应类

package com.sys.my.start.exception;/*** 定义统一错误相应格式*/
public class ErrorResponse {/*** 错误码*/private String errorCode;/*** 错误信息*/private String errorMessage;/*** 错误详情*/private String errorDetails;public ErrorResponse(String number, String message, String description) {this.errorCode = number;this.errorMessage = message;this.errorDetails = description;}public String getErrorCode() {return errorCode;}public String getErrorMessage() {return errorMessage;}public String getErrorDetails() {return errorDetails;}public void setErrorCode(String errorCode) {this.errorCode = errorCode;}public void setErrorMessage(String errorMessage) {this.errorMessage = errorMessage;}public void setErrorDetails(String errorDetails) {this.errorDetails = errorDetails;}
}

4.3.3.编写扫描配置文件类

package com.sys.my.start.exception;import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;/*** 扫描 exception-handler:*      enabled: true* 为true时,启用全局异常处理*/
@Component
@ConfigurationProperties(prefix = "exception-handler")
public class ExceptionHandlerProperties {private boolean enabled;public boolean isEnabled() {return enabled;}public void setEnabled(boolean enabled) {this.enabled = enabled;}
}

4.3.4.编写自动配置类

package com.sys.my.start.exception;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.context.annotation.Import;import java.lang.invoke.MethodHandles;/*** 自动配置类* 通过@Import导入相关文件* EnableAspectJAutoProxy开启AOP代理自动配置* @author 13723* @version 1.0* 2024/2/16 19:16*/
@Configuration
@EnableAspectJAutoProxy(exposeProxy = true
)
@Import({ExceptionHandlerProperties.class})
public class ErrorHandlerAutoProxy {private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
}

4.3.5.编写spring.factories

# 通过SpringBoot的自动注入功能,扫描spring.factories,实现自动注入。
org.springframework.boot.autoconfigure.EnableAutoConfiguration= com.sys.my.start.exception.ErrorHandlerAutoProxy

4.3.6.发布到本地gradle

5.测试

5.1.测试模块引入starter

注意 这里为了保证测试的service模块能够使用到 starter引入springboot依赖,也需要使用api进行调用

// sys_my_service 子项目中的 build.gradle
plugins {id 'java-library'
}
dependencies {// https://mvnrepository.com/artifact/com.alibaba.fastjson2/fastjson2/* json转换 */implementation 'com.alibaba.fastjson2:fastjson2:2.0.46'/* lombok */compileOnly 'org.projectlombok:lombok'annotationProcessor 'org.projectlombok:lombok'/* 日志类 */api 'ch.qos.logback:logback-classic:1.4.14'/* 引入自定义jar包 */api  group: 'org.sys_my_start', name: 'com_sys_my_start', version: '1.0-SNAPSHOT'
}
sourceSets.main.resources {srcDirs = ['src/main/java']include '**/*.xml'
}

5.2.编写测试代码

/*** @author 13723* @version 1.0* 2024/2/16 13:32*/
@RestController
@RequestMapping("/test")
public class TestController {private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());@Resourceprivate TestService testService;@RequestMapping("/hello")public String hello(){return testService.hello();}
}
/*** @author 13723* @version 1.0* 2024/2/16 13:33*/@Service
public class TestService {private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());public String hello(){throw new RuntimeException("测试统一返回异常!");}
}

5.3.测试结果

6.总结

6.1.好处

自定义 Starter 是在 Spring Boot 中实现代码模块化和功能封装的强大工具。它的优势和用途包括:

  • 模块化开发: 自定义 Starter 允许将应用程序的不同功能模块化,使得代码结构更清晰,易于维护和管理。
  • 功能封装: Starter 可以封装特定功能的代码和配置,使得其他开发人员可以轻松地集成和使用这些功能。
  • 提高开发效率: 使用自定义 Starter 可以加速新项目的开发过程,避免重复编写相似的代码,提高开发效率。
  • 标准化配置: Starter 可以定义标准化的配置方式,使得不同项目之间的配置更一致,降低了配置错误的可能性。

通过自定义 Starter,开发团队可以实现代码的复用和标准化,从而提高了代码的复用性和可维护性,降低了开发和维护成本。

6.2.结语

本文介绍了如何创建自定义的 Spring Boot Starter,并详细解释了其优势、用途以及如何提高代码复用性和可维护性。通过自定义 Starter,开发人员可以更轻松地构建模块化的应用程序,并在团队内部实现功能的共享和复用。

鼓励读者在实际项目中尝试创建自己的自定义 Starter,将通用的功能模块化,并通过开源社区与他人分享,促进技术的共享和交流。这将有助于提高团队的开发效率,加速项目的上线和迭代过程,推动软件开发行业的发展。

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

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

相关文章

机器学习 | 实现图像加密解密与数字水印处理

目录 实现窗口可视化 数字图像加密 窗口布局设置 基于混沌Logistic的图像加密 基于三重DES的图像加密 数字图像解密 窗口布局设置 基于混沌Logistic的图像解密 基于三重DES的图像解密 基于LSB的数字水印提取 窗口布局设置 水印的嵌入与提取 实现窗口可视化 这里…

【IO流】FileInputStream 字节输入流

FileInputStream 字节输入流 1. 概述2. 作用3. 书写步骤4. 读取方法5. 文件拷贝6. 注意事项 1. 概述 FileInputStream 是 Java IO 包中的一个类&#xff0c;它是字节输入流的一种。它用于从文件中读取数据&#xff0c;以字节为单位进行读取。 使用 FileInputStream 可以完成以…

数据分析(一) 理解数据

1. 描述性统计&#xff08;summary&#xff09; 对于一个新数据集&#xff0c;首先通过观察来熟悉它&#xff0c;可以打印数据相关信息来大致观察数据的常规特点&#xff0c;比如数据规模&#xff08;行数列数&#xff09;、数据类型、类别数量&#xff08;变量数目、取值范围…

C++--Linux基础使用

文章目录 几个简单命令开机关机重启查看当前目录切换当前目录列出当前目录下的目录和文件列出指定目录下的目录和文件清屏查看/设置时间 目录和文件目录概要目录详细说明相对路径和绝对路径 上古神器vi创建/打开文件vi 的两种模式vi 的常用命令 用户管理组管理用户管理修改用户…

【C++学习手札】多态:掌握面向对象编程的动态绑定与继承机制(初识)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;世界上的另一个我 1:02━━━━━━️&#x1f49f;──────── 3:58 &#x1f504; ◀️ ⏸ ▶️ ☰ &am…

上门回收小程序开发,互联网下发展机遇

在当下生活水平大幅度上升发展下&#xff0c;回收成为了人们日常生活中的一部分。 如今&#xff0c;随着互联网的快速发展&#xff0c;回收行业也进行了升级换代&#xff0c;由传统的线下回收门店到回收箱在到当下的线上互联网回收模式&#xff0c;迈向了“互联网废品回收”的…

Android下SF合成流程重学习之GPU合成

Android下SF合成流程重学习之GPU合成 引言 SurfaceFlinger中的图层选择GPU合成(CLIENT合成方式)时&#xff0c;会把待合成的图层Layers通过renderengine(SkiaGLRenderEngine)绘制到一块GraphicBuffer中&#xff0c;然后把这块GraphicBuffer图形缓存通过调用setClientTarget传递…

Portainer安装/快速上手

前置&#xff1a; 管理docker容器的工具 Portainer: Container Management Software for Kubernetes and Docker https://docs.portainer.io/v/ce-2.9/start/install/server/docker/linux 官网安装教程 Install Portainer CE with Docker on Linux - Portainer Documentat…

如何将阿里云服务器迁移

&#x1f4d1;前言 本文主要是如何将阿里云服务器迁移实现数据转移的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️** &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日…

设计模式七大原则

七大原则有&#xff1a; 单一原则原则接口隔离原则依赖倒转原则里氏替换原则开闭原则迪米特法则合成复用原则 1 单一职责原则 1.1 基本介绍 ​ 对类来说的&#xff0c;即一个类应该只负责一项职责。 如类A负责两个不同的职责&#xff1a;职责1&#xff0c;职责2。当职责1需…

机器人路径平滑——贝塞尔曲线

文章目录 概要线性插值二次Bzier曲线三次Bzier曲线C++实现效果概要 贝塞尔曲线 (/bɛz.i.eɪ/ BEH-zee-ay) 是一种用于计算机图形学和相关领域的参数化曲线。一组离散的控制点通过公式定义平滑、连续的曲线。 本文首先叙述一阶/二阶/三阶贝塞尔曲线的基本理论,然后针对路径不…

SPSSAU【文本分析】|社会关系网络图

社会网络关系图 社会网络关系图展示关键词之间的关系情况&#xff0c;此处的关系是指‘共词矩阵’&#xff0c;即两个关键词同时出现的频数情况&#xff0c;将‘共词矩阵’信息使用可视化方式进行呈现出来&#xff0c;接下来将分别阐述‘共词矩阵’和‘社会网络关系图’。 共词…

uniapp返回上一级页面,传参,上一级通过参数重新请求数据

小程序navigateback传值_微信小程序 wx.navigateBack() 返回页面如何传递参数 - 文章...-CSDN博客 当前页面 上一级页面

模型训练 —— AI算法初识

一、背景 AI算法中模型训练的主要目的是为了让机器学习算法从给定的标注数据中学习规律、特征和模式&#xff0c;并通过调整模型内部参数&#xff0c;使模型能够对未见过的数据进行准确预测或决策。具体来说&#xff1a; 1. **拟合数据**&#xff1a;模型通过训练来识别输入数…

LCR 127. 跳跃训练【简单】

LCR 127. 跳跃训练 题目描述&#xff1a; 今天的有氧运动训练内容是在一个长条形的平台上跳跃。平台有 num 个小格子&#xff0c;每次可以选择跳 一个格子 或者 两个格子。请返回在训练过程中&#xff0c;学员们共有多少种不同的跳跃方式。 结果可能过大&#xff0c;因此结果…

羊大师:羊奶的不同口味带来了什么不同效果

羊大师&#xff1a;羊奶的不同口味带来了什么不同效果 羊奶的口味不同主要是因为其成分和加工方式的差异。尽管口味的变化可能会影响人们对羊奶的喜好程度&#xff0c;但总体而言&#xff0c;不同口味的羊奶在营养价值上并没有明显的差别。 然而&#xff0c;有些品牌的羊奶会添…

使用 apt 源安装 ROCm 6.0.x 在Ubuntu 22.04.01

从源码编译 rocSolver 本人只操作过单个rocm版本的情景&#xff0c;20240218 ubuntu 22.04.01 1&#xff0c;卸载原先的rocm https://docs.amd.com/en/docs-5.1.3/deploy/linux/os-native/uninstall.html # Uninstall single-version ROCm packages sudo apt autoremove ro…

跨境电商服务器怎么选?

随着全球化的加速和互联网的普及&#xff0c;跨境电商逐渐成为企业拓展业务的重要途径。而在跨境电商运营中&#xff0c;服务器的选择对于网站的稳定性和用户体验至关重要。本文将详细介绍如何选择适合跨境电商的服务器。 一、确定服务器需求 在选择跨境电商服务器之前&#…

【hcie-cloud】【28】华为云Stack安全管理服务

文章目录 前言信息安全管理需求安全管理的重要性典型安全事件分析等级保护管理要求等级保护中的安全管理建设安全管理中心云安全运营和管理面临的资源挑战云平台业务安全运营控制和审计问题安全运维内需云平台安全管理需求 安全管理服务详解安全运营中心SOC华为云Stack SOC服务…

shell脚本之高级变量

目录 一、高级变量赋值 1、高级变量赋值总结表 2、相关操作 二、变量间接引用 1、eval命令 一、高级变量赋值 1、高级变量赋值总结表 变量配置方式str 无配置str 为空字符串str 已配置为非空字符串var${str-expr}varexprvarvar$strvar${str:-expr}varexprvarexprvar$str…