Spring Boot 最佳实践

news2025/1/19 23:07:42

本文翻译自国外论坛 medium,原文地址:https://medium.com/@raviyasas/spring-boot-best-practices-for-developers-3f3bdffa0090

Spring Boot 是一种广泛使用且非常流行的企业级高性能框架。以下是一些最佳实践和一些技巧,我们可以使用它们来改进 Spring Boot 应用程序并使其更加高效。这篇文章会有点长,完整读完文章需要一些时间。

1.正确的包目录风格

  • 正确的包目录将有助于轻松理解代码和应用程序的流程。

  • 我们可以使用有意义的包目录来构建我们的应用程序。

  • 我们可以将所有控制器包含在单独的包中,将服务包含在单独的包中,将 util 类包含在单独的包中等等。这种风格在小型微服务中非常方便。

  • 如果我们正在处理庞大的代码库,则可以使用基于功能模块的方法。我们可以根据我们的要求来决定。

基于类型

基于功能模块

推荐博主开源的 H5 商城项目waynboot-mall,这是一套全部开源的微商城项目,包含三个项目:运营后台、H5 商城前台和服务端接口。实现了商城所需的首页展示、商品分类、商品详情、商品 sku、分词搜索、购物车、结算下单、支付宝/微信支付、收单评论以及完善的后台管理等一系列功能。 技术上基于最新得 Springboot3.0、jdk17,整合了 MySql、Redis、RabbitMQ、ElasticSearch 等常用中间件。分模块设计、简洁易维护,欢迎大家点个 star、关注博主。

github 地址:https://github.com/wayn111/waynboot-mall

2.使用设计模式

没什么好说的,设计模式已经是现代编程中编写可维护、可扩展代码的最佳实践。

3.使用 Spring Boot starter

  • 这是 Spring Boot 的一个很酷的功能。

  • 我们可以非常轻松地使用启动器依赖项,而无需一一添加单个依赖项。这些入门依赖项已与所需的依赖项捆绑在一起。

  • 例如,如果我们添加 spring-boot-starter-web 依赖项,默认情况下它会与 jackson、spring-core、spring-mvc 和 spring-boot-starter-tomcat 依赖项捆绑在一起。

  • 所以我们不需要关心单独添加依赖项。

  • 它还可以帮助我们避免版本不匹配。

4.使用生产版本的依赖项

  • 始终建议使用最新的稳定 GA 版本。

  • 有时它可能会因 Java 版本、服务器版本、应用程序类型等而有所不同。

  • 不要使用同一包的不同版本,如果存在多个依赖项,请始终使用 <properties> 指定版本。

5.使用 Lombok

  • 作为一名 Java 开发人员,我们可能听说过 Lombok 项目。

  • Lombok 是一个 Java 库,可用于减少代码并允许我们使用其注释编写干净的代码。

  • 例如,我们可能在某些类(如实体、请求/响应对象、dtos 等)中使用大量的 getter 和 setter 行。

  • 但如果你使用 Lombok,它只是一行,你可以根据你的要求使用@Data、@Getter 或@Setter。

  • 我们也可以使用 Lombok 记录器注释。推荐@Slf4j。

6.将构造函数注入与 Lombok 一起使用

  • 当我们谈论依赖注入时,有两种类型。

  • 一种是“构造函数注入”,另一种是“setter 注入”。除此之外,我们还可以使用非常流行的@Autowired 注释来使用“字段注入”。

  • 但我们强烈建议使用构造函数注入而不是其他类型。因为它允许应用程序在初始化时初始化所有必需的依赖项。

  • 这对于单元测试非常有用。

  • 重要的是,我们可以使用 Lombok 的 @RequiredArgsConstructor 注释来使用构造函数注入。

7.使用 slf4j 日志

  • 日志记录非常重要。

  • 如果我们的应用程序在生产过程中出现问题,日志记录是找出根本原因的唯一方法。

  • 因此,在添加记录器、日志消息类型、记录器级别和记录器消息之前应该仔细考虑。

  • 不要使用 System.out.print()

  • 建议将 Slf4j 与 Spring Boot 中默认的日志框架 logback 一起使用。

  • 始终使用 slf4j 的 {} 占位符语法,避免在记录器消息中使用字符串插值。因为字符串插值会消耗更多的内存。

  • 我们可以使用 Lombok @Slf4j 注释非常轻松地创建日志记录器。

  • 如果我们处于微服务环境中,则可以使用 ELK 技术栈。

8.控制器仅用于路由

  • 控制器专用于路由。

  • 它是无状态且单身的。

  • DispatcherServlet 将检查控制器上的 @RequestMapping

  • 控制器是请求的最终目标,请求将交给服务层并由服务层处理。

  • 业务逻辑不应位于控制器中。

9.使用 Service 层来实现业务逻辑

  • 完整的 Service 层业务逻辑包含验证、缓存等。

  • Service 服务与持久层通信并接收结果。

  • Service 服务也是单例的。

10.避免空指针异常

  • 为了避免 NullPointerException,我们可以使用 java.util 包中的 Optional。

  • 我们还可以使用空安全库。例如:Apache Commons StringUtils

  • 对已知对象调用 equals() 和 equalsIgnoreCase() 方法。

  • 使用 valueOf() 而不是 toString()

  • 使用基于 IDE 的 @NotNull 和 @Nullable 注释。

11.使用集合框架的最佳实践

  • 对我们的数据集使用适当的集合。

  • 将 forEach 与 Java 8 功能结合使用,并避免使用旧版 for 循环。

  • 使用接口类型而不是实现。

  • 使用 isEmpty() 而不是 size() 以获得更好的可读性。

  • 不返回空值,可以返回空集合。

  • 如果我们使用对象作为要存储在基于哈希的集合中的数据,则应重写 equals() 和 hashCode() 方法。

12.使用分页

  • 这将提高应用程序的性能。

  • 如果我们使用 Spring Data JPA,则 PagingAndSortingRepository 使分页的使用变得非常容易且几乎不费吹灰之力。

13.使用缓存

  • 在谈论应用程序性能时,缓存是另一个重要因素。

  • 默认情况下,Spring Boot 通过 ConcurrentHashMap 提供缓存,我们可以通过 @EnableCaching 注解来实现这一点。

  • 如果我们对默认缓存不满意,可以使用 Redis、Hazelcast 或任何其他分布式缓存实现。

  • Redis 和 Hazelcast 是内存缓存方法。我们还可以使用数据库缓存实现。

14.使用自定义异常处理程序和全局异常处理

  • 这在使用大型企业级应用程序时非常重要。

  • 除了一般异常之外,我们可能还会有一些场景来识别某些特定的错误情况。

  • 异常顾问可以使用 @ControllerAdvice 创建,我们可以创建具有有意义细节的单独异常。

  • 它将使得将来识别和调试错误变得更加容易。

15.使用自定义响应对象

  • 自定义响应对象可用于返回包含某些特定数据的对象,并满足 HTTP 状态代码、API 代码、消息等要求。

  • 我们可以使用构建器设计模式来创建具有自定义属性的自定义响应对象。

16.删除不必要的代码、变量、方法和类。

  • 未使用的变量声明将占用一些内存。

  • 删除未使用的方法、类等,因为它会影响应用程序的性能。

  • 尽量避免嵌套循环,我们可以使用 map 代替。

17.使用注释

  • 注释是一个很好的做法。

  • 不要对一切代码发表注释。相反,我们可以使用类、函数、方法、变量等有意义的单词编写描述性代码。

  • 删除注释代码、误导性注释和故事型注释。

  • 我们可以使用注释进行警告,并解释一些乍一看难以理解的内容。

18.对类、方法、函数、变量和其他属性使用有意义的词语。

  • 这看起来很简单,但影响却是巨大的。

  • 始终使用正确的有意义且可搜索的命名约定以及正确的大小写。

  • 通常,我们在声明类、变量和常量时使用名词或短语。例如:字符串 firstName,const isValid

  • 我们可以使用带有形容词的动词和短语来表示函数和方法。例如:readFile()、sendData()

  • 避免使用缩写变量名和意图揭示的名称。例如: int i;字符串 getExUsr;

  • 如果我们有意义地使用此功能,则可以减少声明注释行。由于它具有有意义的名称,新开发人员可以通过阅读代码轻松理解。

19.使用正确的大小写进行声明

  • 有许多不同的大小写,如大写、小写、驼峰命名、帕斯卡命名、蛇命名、大蛇式命名、短横线命名等。

  • 但我们需要确定哪个案例专用于哪个变量。

  • 通常我会遵循如下方式,

    类 — 帕斯卡命名

    方法和变量 — 驼峰命名

    常量 — 大蛇式命名

    数据库相关字段 — 短横线命名

    这只是一个例子,它可能与我们在公司遵循的标准不同。

20.简单点

  • 始终尝试编写简单、可读的代码。

  • 同样简单的逻辑可以用不同的方式实现,但是如果不可读或不理解就很难理解。

  • 有时复杂的逻辑会消耗更多的内存。

  • 编写代码时尝试使用 KISS、DRY 和 SOLID 原则。我将在以后的文章中解释这一点。

21.使用通用的代码格式样式

  • 格式样式因开发人员而异。编码风格的改变也被认为是一种改变,并且会使代码合并变得非常困难。

  • 为了避免这种情况,团队可以采用通用的编码格式。

22.使用 SonarLint 插件

  • 这对于识别小错误和最佳实践非常有用,以避免不必要的错误和代码质量问题。

  • 我们可以将插件安装到我们最喜欢的 IDE 中。

最后

至此本文讲解内容到此完毕感谢阅读,希望本文能对你有所帮助。

关注公众号【waynblog】每周分享技术干货、开源项目、实战经验、高效开发工具等,您的关注将是我的更新动力!

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

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

相关文章

【Git分布式版本控制系统一】你还不会用Git进行项目管理?

&#x1f942;(❁◡❁)您的点赞&#x1f44d;➕评论&#x1f4dd;➕收藏⭐是作者创作的最大动力&#x1f91e; 前言 众所周知&#xff0c;分布式版本控制系统git是工作以后进行项目管理必不可少的工具&#xff0c;我将繁杂的命令进行了归类整理和总结&#xff0c;供大家参考学习…

springboot+vue真实项目部署详细步骤

sprinbootvue项目详细部署步骤 文章目录 sprinbootvue项目详细部署步骤1、准备部署文件2、安装mysql2.1、配置mysql2.2、用navicat远程连接mysql导入数据2.3、导入mysql数据 3、安装jdk4、安装nginx5、安装redis6、创建对应的目录层级和启动6.1 构建启动脚本6.2 、修改两个后台…

数据库索引的使用

1、MySQL的基本架构 架构图 左边的client可以看成是客户端&#xff0c;客户端有很多&#xff0c;像我们经常你使用的CMD黑窗口&#xff0c;像我们经常用于学习的WorkBench&#xff0c;像企业经常使用的Navicat工具&#xff0c;它们都是一个客户端。右边的这一大堆都可以看成是…

Python系统学习1-5-容器

1、字符串 字符串是不可变的数据 原因&#xff1a;如果在原有内存中修改&#xff0c;很可能破坏其他数据的空间 现象&#xff1a;每次需要修改字符串时&#xff0c;都会创建新数据&#xff0c;替换变量中存储的地址 字符串字面值 (1)建议使用双引号 name01 "悟空&q…

中介者模式(C++)

定义 用一个中介对象来封装(封装变化)一系列的对象交互。中介者使各对象不需要显式的相互引用(编译时依赖->运行时依赖)&#xff0c;从而使其耦合松散(管理变化)&#xff0c;而且可以独立地改变它们之间的交互。 应用场景 在软件构建过程中&#xff0c;经常会出现多个对象…

VUE框架:vue2转vue3全面细节总结(5)过渡动效

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人_python人工智能视觉&#xff08;opencv&#xff09;从入门到实战,前端,微信小程序-CSDN博客 最新的uniapp毕业设计专栏也放在下方了&#xff1a; https://blog.csdn.net/lbcy…

公文写作素材:“干”字型排比句40例

1.怀着真诚“想干”&#xff0c;扛着担当“敢干”&#xff0c;瞄着路径“能干”&#xff0c;盯着责任“真干”&#xff0c;想着办法“会干”&#xff0c;带着智慧“巧干”&#xff0c;揣着情怀“认干”&#xff0c;铆着劲头“实干”。 2.脱下“皮鞋”、换上“运动鞋”&#xff…

3 vue的if语法

vue的if语法是相当于一个标签的属性来写进去的&#xff0c;比如说<h1 v-if“”>。要注意的是if语句里可以自动从数据层取值的&#xff0c;比如<h1 v-if"message">&#xff0c;这里就会自动把key为message的值取过来&#xff0c;而如果要传一个字符串&…

Vue [Day5]

自定义指令 全局注册 和 局部注册 inserted在指令所在的元素 被插入到页面中时&#xff0c;触发 main.js import Vue from vue import App from ./App.vueVue.config.productionTip false// 1.全局注册指令 Vue.directive(focus, {// inserted在指令所在的元素 被插入到页…

Java个人博客系统--基于Springboot的设计与实现

目录 一、项目概述 应用技术 接口实现&#xff1a; 数据库定义&#xff1a; 数据库建表&#xff1a; 博客表数据库相关操作&#xff1a; 添加项⽬公共模块 加密MD5 页面展示&#xff1a;http://121.41.168.121:8080/blog_login.html 项目源码&#xff1a;https://gitee…

初学 Python 需要安装哪些软件?超级实用,小白必看!

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 编程这个东西是真的奇妙。 对于懂得的人来说&#xff0c;会觉得这个工具是多么的好用、有趣&#xff0c;而对于小白来说&#xff0c;就如同大山一样。 其实这个都可以理解&#xff0c;大家都是这样过来的。 那么接下来就说…

Spring简述

Sping是什么Spring主要模块IOCDI依赖注入的三种方式 AOP术语 Sping是什么 Spring是一个轻量级的开源框架&#xff0c;主要作用是为了简化开发&#xff0c;它以IOC&#xff08;控制反转&#xff09;和AOP&#xff08;面向切面编程&#xff09;为内核 Spring主要模块 我们一般…

cocosCreator 之 i18n多语言插件

版本&#xff1a; v3.4.0 环境&#xff1a; Mac 简介 i18n是国际化的简称&#xff0c; 全名&#xff1a;internationalization&#xff1b;取首尾字符i和n&#xff0c;18代表单词中间的字符数目。 该插件不需要产品做太多的改变&#xff0c;通过语言的设置&#xff0c;实现不…

P1194 买礼物(最小生成树)(内附封面)

买礼物 题目描述 又到了一年一度的明明生日了&#xff0c;明明想要买 B B B 样东西&#xff0c;巧的是&#xff0c;这 B B B 样东西价格都是 A A A 元。 但是&#xff0c;商店老板说最近有促销活动&#xff0c;也就是&#xff1a; 如果你买了第 I I I 样东西&#xff0…

【逗老师的PMP学习笔记】6、项目的进度管理

目录 一、规划进度管理1、【关键输出 】进度管理计划 二、定义活动1、【关键工具】拆解2、【关键工具】滚动式规划3、【关键输出】活动清单和活动属性4、【关键输出】里程碑清单 三、排列活动顺序1、【关键工具】紧前关系绘图法2、【关键工具】提前量和滞后量3、【关键输出】项…

Linux 中使用 verdaccio 搭建私有npm 服务器

安装 Node Linux中安装Node 安装verdaccio npm i -g verdaccio安装完成 输入verdaccio,出现下面信息代表安装成功&#xff0c;同时输入verdaccio后verdaccio已经处于运行状态&#xff0c;当然这种启动时暂时的&#xff0c;我们需要通过pm2让verdaccio服务常驻 ygiZ2zec61wsg…

网络编程——深入理解TCP/IP协议——OSI模型和TCP/IP模型:构建网络通信的基石

TCP/IP协议— 一、简介 TCP/IP协议&#xff0c;即传输控制协议/互联网协议&#xff0c;是一组用于在计算机网络中实现通信的协议。它由两个主要的协议组成&#xff1a;TCP&#xff08;传输控制协议&#xff09;和IP&#xff08;互联网协议&#xff09;。TCP负责确保数据的可靠…

【Linux取经路】冯诺依曼结构体系与操作系统的碰撞

文章目录 一、冯诺依曼体系结构1.1 硬件介绍1.2 内存的重要性 二、操作系统2.1 设计操作系统的目的2.2 操作系统是如何进行管理的&#xff1f; 一、冯诺依曼体系结构 我们现在常见的计算机&#xff0c;如笔记本&#xff0c;以及我们不常见的计算机&#xff0c;如服务器&#x…

Pycharm连接服务器

前提&#xff1a;必须为pycharm专业版才能连接到服务器 以下为pycharm2023专业版 一、连接 系统环境 虚拟环境&#xff08;前提&#xff1a;已安装anaconda&#xff09; (1) anaconda环境 (2) 自己创建的虚拟环境 这里为envs下的spotr 二、查看连接情况 选择自动上传

Docker 发布一个springboot项目

文章目录 1、新建SpringBootDemo项目并打包2、使用Dockerfile打包&#xff08;基础用法&#xff09;进一步maven源码打包法 3、更进一步&#xff08;maven插件打包&#xff09;docker-maven-pluginspring-boot-maven-plugin前提条件本地环境配置项目环境配置maven插件打包运行校…