环境:SpringBoot3.2.5
以下是关于SpringBoot一些最佳实践和一些技巧,你可以使用它们来改进你的Spring Boot应用程序并使其更高效。(本篇文章翻译自外文)
1. 适合的包风格
正确的包将有助于轻松理解代码和应用程序的流程
使用有意义的包来构建应用程序
可以将所有Controller包含到一个单独的包中,将Service包含在一个单独包中,还可以将util类包含在另一个包中…等等。这种风格在小型微服务中非常方便
如果你正在处理一个巨大的代码库,可以使用基于功能的方法
基于类型

基于功能

2. 使用设计模式
毫无疑问,设计模式已经是最佳实践了
但你必须确定可以使用它们的地方
3. 使用Spring Boot Starters
我们可以非常容易地使用starter依赖项,而无需逐个添加单个依赖项。这些starter依赖项已经与所需的依赖项绑定在一起
例如,如果我们添加spring-boot-starter-web依赖项,默认情况下它与jackson、spring-core、spring-mvc和spring-boot-starter-tomcat依赖项捆绑在一起
因此,我们不需要关心单独添加依赖项
此外,它还帮助我们避免版本不匹配
4. 使用正确版本的依赖项
始终建议使用最新的稳定GA版本
有时,它可能会因Java版本、server版本、应用程序类型等而异
不要使用同一个包的不同版本,如果存在多个依赖项,请始终使用<properties>指定版本。

5. 使用Lombok
因公司要求不同,我们是禁止使用这玩意的,所以就不说了。
6. 使用构造函数注入
@Servicepublic class UserService {private final UserRepository userRepository ;public UserService(UserRepository userRepository) {this.userRepository = userRepository ;}}
构造函数注入允许应用程序在初始化时初始化所有必需的依赖项。
7. 使用SLF4J日志
private static final Logger logger = LoggerFactory.getLogger(UserService.class) ;public void save(String name) {logger.info("参数信息: {}", name) ;}
日志记录非常重要
如果应用程序在生产过程中出现问题,记录日志是找出根本原因的唯一方法
因此,在添加记录器、日志消息类型、记录器级别和记录器消息之前,你应该仔细考虑
不用使用System.out.println()
Slf4j建议与logback一起使用,logback是Spring Boot中的默认日志框架
始终使用slf4j{},并避免在logger消息中使用字符串插值。因为字符串插值会消耗更多的内存。
如果你处于微服务环境中,则可以使用ELK栈
8. 仅在路由时使用控制器

控制器专用于路由
它是无状态的和单例的
DispatcherServlet将检查控制器上的@RequestMapping
控制器是请求的最终目标,然后请求将被移交给服务层并由服务层处理
业务逻辑不应在控制器中
9. Service用于业务逻辑
完整的业务逻辑包括验证、缓存等
Service层与持久层通信并接收结果
Service也应该是单例的
10. 避免NullPointerException

为了避免NullPointerException,您可以使用java.util包中的Optional
你也可以使用null安全库。例如:Apache Commons StringUtils
在已知对象上调用equals()和equalsIgnoreCase()方法
在toString()上使用valueOf()
使用基于IDE的@NotNull和@Nullable注释
11. 使用集合框架的最佳实践
为你的数据集使用适当的集合
将forEach与Java 8功能结合使用,避免使用遗留的for循环
使用接口类型而不是实现
使用isEmpty()而不是size()可获得更好的可读性
不返回null值,可以返回空集合
如果使用对象作为要存储在基于哈希的集合中的数据,则应重写equals()和hashCode()方法
12. 使用分页

这将提高应用程序的性能
如果您使用的是Spring Data JPA,PagingAndSortingRepository使使用分页变得非常容易,而且几乎不需要付出什么努力
public interface CustomerRepository extends JpaRepository<Customer, Integer> {}
通过上面集成JpaRepository将使得分页变得非常简单。
13. 使用缓存
当谈到应用程序性能时,缓存是另一个重要因素
默认情况下,Spring Boot使用ConcurrentHashMap提供缓存,您可以通过@EnableCaching注释实现这一点
如果你对默认缓存不满意,可以使用Redis、Hazelcast或任何其他分布式缓存实现
Redis和Hazelcast是内存缓存方法。您还可以使用数据库缓存实现
14. 将自定义异常处理程序与全局异常处理一起使用

在使用大型企业级应用程序时,这一点非常重要
除了一般的例外情况,我们可能有一些场景来识别一些特定的错误案例
异常顾问可以使用@ControllerAdvice创建,我们可以创建具有有意义细节的单独异常
这将使识别和调试错误变得更加容易
15. 自定义响应

自定义响应对象可用于返回具有一些特定数据要求的对象,如HTTP状态码、API代码、消息等
我们可以使用builder设计模式来创建具有自定义属性的自定义响应对象
16. 删除不必要的代码、变量、方法和类

未使用的变量声明将获取一些内存
删除未使用的方法、类等,因为这会影响应用程序的性能
尽量避免嵌套循环。你可以使用Maps
17. 使用注释
注释是一种很好的做法,除非你滥用它
不要对每件事都注释。相反,你可以使用有意义的单词来描述类、函数、方法、变量等
删除注释代码、误导性注释和故事类型注释
你可以使用注释来表示警告,并解释一些乍一看很难理解的东西
18. 为类、方法、函数、变量和其他属性使用有意义的单词

始终使用有意义的、可搜索的命名规范和正确的大小写
通常,我们在声明类、变量和常量时会使用名词或简短的短语。例如:String firstName、const isValid
函数和方法可以使用动词和短语搭配形容词。例如:readFile(), sendData()
避免使用缩写变量名和意图。例:int i;字符串getExUsr
19. 声明使用正确的大小写

类 — PascalCase
方法&变量— camelCase
常量 — SCREAMING_SNAKE_CASE
数据库字段 — snake_case
20. 使用通用的代码格式化样式

格式化样式因开发者而异。编码风格的改变也被认为是一种改变,这会使代码合并变得非常困难;为了避免这种情况,团队可以使用一种通用的编码格式。
21. 使用SonarLint

SonarLint是一款代码质量检查工具,使用它对于识别小bug和最佳实践非常有用,可以避免不必要的bug和代码质量问题,你可以将插件安装到IDE中。
以上是本篇文章的全部内容,如对你有帮助帮忙点赞+转发+收藏。
推荐文章
SpringBoot中Controller接口参数还可以这样玩?
警惕!SpringBoot错误发布事件,造成死锁Deadlock
SpringBoot3第三方接口调用10种方式,最后一种你肯定没用过



