SpringBoot 生产中 16 条最佳实践

article/2025/9/18 23:22:21

欢迎关注方志朋的博客,回复”666“获面试宝典

Spring Boot是最流行的用于开发微服务的Java框架。在本文中,我将与你分享自2016年以来我在专业开发中使用Spring Boot所采用的最佳实践。这些内容是基于我的个人经验和一些熟知的Spring Boot专家的文章。

在本文中,我将重点介绍Spring Boot特有的实践(大多数时候,也适用于Spring项目)。以下依次列出了最佳实践,排名不分先后。

1、使用自定义BOM来维护第三方依赖

这条实践是我根据实际项目中的经历总结出的。

Spring Boot项目本身使用和集成了大量的开源项目,它帮助我们维护了这些第三方依赖。但是也有一部分在实际项目使用中并没有包括进来,这就需要我们在项目中自己维护版本。如果在一个大型的项目中,包括了很多未开发模块,那么维护起来就非常的繁琐。

怎么办呢?事实上,Spring IO Platform就是做的这个事情,它本身就是Spring Boot的子项目,同时维护了其他第三方开源库。我们可以借鉴Spring IO Platform来编写自己的基础项目platform-bom,所有的业务模块项目应该以BOM的方式引入。这样在升级第三方依赖时,就只需要升级这一个依赖的版本而已。

<dependencyManagement><dependencies><dependency><groupId>io.spring.platform</groupId><artifactId>platform-bom</artifactId><version>Cairo-SR3</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

2、使用自动配置

Spring Boot的一个主要特性是使用自动配置。这是Spring Boot的一部分,它可以简化你的代码并使之工作。当在类路径上检测到特定的jar文件时,自动配置就会被激活。

使用它的最简单方法是依赖Spring Boot Starters。因此,如果你想与Redis进行集成,你可以首先包括:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

如果你想与MongoDB进行集成,需要这样:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

借助于这些starters,这些繁琐的配置就可以很好地集成起来并协同工作,而且它们都是经过测试和验证的。这非常有助于避免可怕的Jar地狱。

https://dzone.com/articles/what-is-jar-hell

通过使用以下注解属性,可以从自动配置中排除某些配置类:

@EnableAutoConfiguration(exclude = {ClassNotToAutoconfigure.class})

但只有在绝对必要时才应该这样做。

有关自动配置的官方文档可在此处找到:

https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-auto-configuration.html。

3、使用Spring Initializr来开始一个新的Spring Boot项目

这一条最佳实践来自Josh Long (Spring Advocate,@starbuxman)。

Spring Initializr 提供了一个超级简单的方法来创建一个新的Spring Boot项目,并根据你的需要来加载可能使用到的依赖。

https://start.spring.io/

使用Initializr创建应用程序可确保你获得经过测试和验证的依赖项,这些依赖项适用于Spring自动配置。你甚至可能会发现一些新的集成,但你可能并没有意识到这些。

4、考虑为常见的组织问题创建自己的自动配置

这一条也来自Josh Long(Spring Advocate,@starbuxman)——这个实践是针对高级用户的。

如果你在一个严重依赖Spring Boot的公司或团队中工作,并且有共同的问题需要解决,那么你可以创建自己的自动配置。

这项任务涉及较多工作,因此你需要考虑何时获益是值得投入的。与多个略有不同的定制配置相比,维护单个自动配置更容易。

如果将这个提供Spring Boot配置以开源库的形式发布出去,那么将极大地简化数千个用户的配置工作。

5、正确设计代码目录结构

尽管允许你有很大的自由,但是有一些基本规则值得遵守来设计你的源代码结构。

避免使用默认包。确保所有内容(包括你的入口点)都位于一个名称很好的包中,这样就可以避免与装配和组件扫描相关的意外情况;

将Application.java(应用的入口类)保留在顶级源代码目录中;

我建议将控制器和服务放在以功能为导向的模块中,但这是可选的。一些非常好的开发人员建议将所有控制器放在一起。不论怎样,坚持一种风格!

6、保持@Controller的简洁和专注

Controller应该非常简单。你可以在此处阅读有关GRASP中有关控制器模式部分的说明。你希望控制器作为协调和委派的角色,而不是执行实际的业务逻辑。以下是主要做法:

https://en.wikipedia.org/wiki/GRASP(object-orienteddesign)#Controller

1、控制器应该是无状态的!默认情况下,控制器是单例,并且任何状态都可能导致大量问题;

2、控制器不应该执行业务逻辑,而是依赖委托;

3、控制器应该处理应用程序的HTTP层,这不应该传递给服务;

4、控制器应该围绕用例/业务能力来设计。

要深入这个内容,需要进一步地了解设计REST API的最佳实践。无论你是否想要使用Spring Boot,都是值得学习的。

7、围绕业务功能构建@Service

Service是Spring Boot的另一个核心概念。我发现最好围绕业务功能/领域/用例(无论你怎么称呼都行)来构建服务。

在应用中设计名称类似 AccountServiceUserServicePaymentService这样的服务,比起像 DatabaseService、 ValidationService、 CalculationService这样的会更合适一些。

你可以决定使用Controler和Service之间的一对一映射,那将是理想的情况。但这并不意味着,Service之间不能互相调用!

8、使数据库独立于核心业务逻辑之外

我之前还不确定如何在Spring Boot中最好地处理数据库交互。在阅读了罗伯特·C·马丁的“Clear Architecture”之后,对我来说就清晰多了。

你希望你的数据库逻辑于服务分离出来。理想情况下,你不希望服务知道它正在与哪个数据库通信,这需要一些抽象来封装对象的持久性。

罗伯特C.马丁强烈地说明,你的数据库是一个“细节”,这意味着不将你的应用程序与特定数据库耦合。过去很少有人会切换数据库,我注意到,使用Spring Boot和现代微服务开发会让事情变得更快。

9、保持业务逻辑不受Spring Boot代码的影响

考虑到“Clear Architecture”的教训,你还应该保护你的业务逻辑。将各种Spring Boot代码混合在一起是非常诱人的……不要这样做。如果你能抵制诱惑,你将保持你的业务逻辑可重用。

部分服务通常成为库。如果不从代码中删除大量Spring注解,则更容易创建。

10、推荐使用构造函数注入

这一条实践来自Phil Webb(Spring Boot的项目负责人, @phillip_webb)。

保持业务逻辑免受Spring Boot代码侵入的一种方法是使用构造函数注入。不仅是因为 @Autowired注解在构造函数上是可选的,而且还可以在没有Spring的情况下轻松实例化bean。

11、熟悉并发模型

我写过的最受欢迎的文章之一是“介绍Spring Boot中的并发”。我认为这样做的原因是这个领域经常被误解和忽视。如果使用不当,就会出现问题。

https://www.e4developer.com/2018/03/30/introduction-to-concurrency-in-spring-boot/

在Spring Boot中,Controller和Service是默认是单例。如果你不小心,这会引入可能的并发问题。你通常也在处理有限的线程池。请熟悉这些概念。

如果你正在使用新的WebFlux风格的Spring Boot应用程序,我已经解释了它在“Spring’s WebFlux/Reactor Parallelism and Backpressure”中是如何工作的。

12、加强配置管理的外部化

这一点超出了Spring Boot,虽然这是人们开始创建多个类似服务时常见的问题……

你可以手动处理Spring应用程序的配置。如果你正在处理多个Spring Boot应用程序,则需要使配置管理能力更加强大。

我推荐两种主要方法:

1、使用配置服务器,例如Spring Cloud Config;2、将所有配置存储在环境变量中(可以基于git仓库进行配置)。

这些选项中的任何一个(第二个选项多一些)都要求你在DevOps更少工作量,但这在微服务领域是很常见的。

13、提供全局异常处理

你真的需要一种处理异常的一致方法。Spring Boot提供了两种主要方法:

1、你应该使用HandlerExceptionResolver定义全局异常处理策略;2、你也可以在控制器上添加@ExceptionHandler注解,这在某些特定场景下使用可能会很有用。

这与Spring中的几乎相同,并且Baeldung有一篇关于REST与Spring的错误处理的详细文章,非常值得一读。

https://www.baeldung.com/exception-handling-for-rest-with-spring

14、使用日志框架

你可能已经意识到这一点,但你应该使用Logger进行日志记录,而不是使用System.out.println()手动执行。这很容易在Spring Boot中完成,几乎没有配置。只需获取该类的记录器实例:

Logger logger = LoggerFactory.getLogger(MyClass.class);

这很重要,因为它可以让你根据需要设置不同的日志记录级别。

15、测试你的代码

这不是Spring Boot特有的,但它需要提醒——测试你的代码!如果你没有编写测试,那么你将从一开始就编写遗留代码。

如果有其他人使用你的代码库,那边改变任何东西将会变得危险。当你有多个服务相互依赖时,这甚至可能更具风险。

由于存在Spring Boot最佳实践,因此你应该考虑将Spring Cloud Contract用于你的消费者驱动契约,它将使你与其他服务的集成更容易使用。

16、使用测试切片让测试更容易,并且更专注

这一条实践来自Madhura Bhave(Spring 开发者, @madhurabhave23)。

使用Spring Boot测试代码可能很棘手——你需要初始化数据层,连接大量服务,模拟事物……实际上并不是那么难!答案是使用测试切片。

使用测试切片,你可以根据需要仅连接部分应用程序。这可以为你节省大量时间,并确保你的测试不会与未使用的内容相关联。来自spring.io的一篇名为Custom test slice with Spring test 1.4的博客文章解释了这种技术。

https://spring.io/blog/2016/08/30/custom-test-slice-with-spring-boot-1-4

总结

感谢Spring Boot,编写基于Spring的微服务正变得前所未有的简单。我希望通过这些最佳实践,你的实施过程不仅会变得很快,而且从长远来看也会更加强大和成功。祝你好运!

热门内容:
  • MySQL夺命15问,你能坚持到第几问?

  • HashMap夺命14问,你能坚持到第几问?

  • 干掉visio,这个画图神器真的绝了!!!

  • 尽快卸载这两款恶意浏览器插件!已有近 50 万用户安装

  • UUID正在被NanoID取代?

 

f9c5ac9d74ad59502f80d261125decdc.png

 
最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡


http://chatgpt.dhexx.cn/article/50yJlQ79.shtml

相关文章

SpringBoot快速开发利器:CLI 属实真牛逼!

欢迎关注方志朋的博客&#xff0c;回复”666“获面试宝典 来源&#xff1a;blog.csdn.net/qq_31635851/article/details/120411711/ 安装 Spring Boot CLI演示项目结构用 Spring Boot CLI 创建 Hello World 示例使用 Grab 注释Spring Boot CLI 测试应用程序使用 Spring Boot CL…

一个程序员的水平能差到什么程度?

欢迎关注方志朋的博客&#xff0c;回复”666“获面试宝典 来源&#xff1a;www.zhihu.com/question/314644210 逛知乎的时候&#xff0c;看到一个有意思的话题&#xff1a;一个程序员的水平能差到什么程度&#xff1f; 看了下面的回答&#xff0c;不得不说&#xff0c;真是小刀…

spring boot面试问题集锦

方志鹏 2019/09/06 Q: 什么是spring boot&#xff1f; A&#xff1a;多年来&#xff0c;随着新功能的增加&#xff0c;spring变得越来越复杂。只需访问页面https://spring.io/projects&#xff0c;我们将看到所有在应用程序中使用的不同功能的spring项目。如果必须启动一个新…

五分钟体验分布式事务框架Seata

Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式解决方案。本教程旨在为读者提供一个快速入门seata的案例&#xff0c;详细使用请参考…

SpringBoot非官方教程 | 第二十五篇:2小时学会springboot

转载请标明出处&#xff1a; https://www.fangzhipeng.com/springboot/2017/05/25/sb25-2hour.html 本文出自方志朋的博客 一.什么是spring boot Takes an opinionated view of building production-ready Spring applications. Spring Boot favors convention over configurat…

Spring Cloud Alibaba教程:使用Nacos作为配置中心

转载请标明出处&#xff1a; https://blog.csdn.net/forezp/article/details/90729945 本文出自方志朋的博客 个人博客纯净版https://www.fangzhipeng.com/springcloud/2019/06/01/sc-nacos-config.html 在上一篇文章中讲解了如何使用Nacos作为服务注册中心注册。Nacos除了可以…

20 个实例玩转 Java 8 Stream

点击关注公众号&#xff0c;Java干货及时送达 先贴上几个案例&#xff0c;水平高超的同学可以挑战一下&#xff1a; 1. 从员工集合中筛选出salary大于8000的员工&#xff0c;并放置到新的集合里。 2. 统计员工的最高薪资、平均薪资、薪资之和。 3. 将员工按薪资从高到低排序&am…

2019新鲜出炉的BAT通关面试题 Java岗

点击上方“方志朋”&#xff0c;选择“置顶或者星标” 你的关注意义重大&#xff01; 来源于公号&#xff1a;孤独烟 由于近期是互联网寒冬&#xff0c;然而烟哥的好友还是顶着重重压力出去面试&#xff0c;最终斩获无数offer。 在烟哥的沟通下&#xff0c;终于套得其中一套题…

史上最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)

转载请标明出处&#xff1a; https://www.fangzhipeng.com/springcloud/2017/06/02/sc02-rest-ribbon.html 本文出自方志朋的博客 个人博客纯净版&#xff1a;https://www.fangzhipeng.com/springcloud/2017/06/02/sc02-rest-ribbon.html 最新Finchley版本&#xff1a; https:…

史上最简单的 SpringCloud 教程 | 终章

转载请标明出处&#xff1a; http://blog.csdn.net/forezp/article/details/70148833 本文出自方志朋的博客 扫码关注有惊喜 &#xff08;转载本站文章请注明作者和出处 方志朋的博客&#xff09; 个人博客纯净版https://www.fangzhipeng.com/spring-cloud.html 错过了这一篇…

SpringCloud-Finchley集成Zuul服务网关组件并实现回退

1.服务网关Zuul介绍 服务网关是微服务架构中一个不可或缺的部分。通过服务网关统一向外系统提供REST API的过程中&#xff0c;除了具备服务路由、均衡负载功能之外&#xff0c;它还具备了权限控制等功能。Spring Cloud Netflix中的Zuul就担任了这样的一个角色&#xff0c;为微…

数控机床设备物联网远程控制解决方案

数控机床设备应用物联网技术方案实现远程监控管理背景 数控机床设备利用先进的计算机和网络技术进行设备物联网。利用计算机硬件、软件、网络设备通信设备以及其他办公设备,进行信息的收集、传输、加工、储存、更新和维护,以战略竟优、提高效率为目的,支持高层决策、中层管理…

远程控制树莓派

一、局域网 1. 让树莓派连上手机热点或wifi 将空白的ssh文件放入树莓派SD卡的boot盘 手动创建一个空白记事本.txt文件&#xff0c;命名为ssh&#xff0c;重命名&#xff0c;删掉.txt扩展名。将这个文件放入SD卡的boot盘中。 配置wifi文件&#xff0c;放入SD卡的boot盘 用同样…

推荐一款国产远程控制软件ToDesk,轻量级,不限速,开启云办公新模式

一、远程办公新时代 前段时间&#xff0c;我们公司使用的向日葵远程控制竟然崩了&#xff0c;导致无法登录&#xff0c;当时以为是公司网络出问题了&#xff0c;结果并妹有。后来就看到官方回应说&#xff0c;因为大量用户涌入导致服务器宕机了&#xff01; 不管你们信不信&a…

远程控制电脑

任意网络环境下的设备远程控制任意网络环境下的设备 对于远程操控电脑已经不是什么难的事情了&#xff0c;但是对于有的操作方法其实还是有难度的&#xff0c;今天我就介绍一下如何远程控制电脑。 1、远程控制的好处 远程控制的好处那就多了&#xff0c;不管你是学生还是…

企业如何实现IoT物联网远程控制

在IoT物联网革命中&#xff0c;一切都正在变得智能化&#xff0c;因此也可以称其为连接设备的革命。如今&#xff0c;物联网采用信息化技术手段&#xff0c;促进了人类生活和生产服务的全面升级&#xff0c;从智能家居硬件、智能穿戴、智能交通、智能医疗、智能车载、嵌入式开发…

服务器如何开启远程控制,远程控制命令设置方法介绍

大家在长时间的使用电脑以后,电脑就会出现一些毛病,这个时候人们都会给电脑维修工打电话亲上 门 儿服务,而大家都知道上门儿服务费用是非常的高的。但是远程控制出现就解决了这个问题,大家可以通过网络工程师对自己电脑进行远程控制,从而实现修理电脑的目的。但是有非常多…

快速实现远程控制Android手机

直接在web端或者手机端远程控制其他手机&#xff0c;想想都刺激&#xff0c;于是在google上一阵狂搜&#xff0c;发现很多方案都要root手机&#xff0c;直接pass&#xff0c;还有的方案需要写大量看不懂的代码&#xff0c;pass。最近一直在研究的冰狐智能辅助平台出了一个远程控…

内网远程控制安卓设备软件推荐

有些企业需要在内网环境远程控制安卓设备&#xff0c;实现批量维护安卓设备等需求。有什么软件或者解决方案&#xff0c;可以实现内网远程控制安卓设备呢&#xff1f; 这个问题要分两个情况解决&#xff0c;看你能不能走外网。如果IT和安卓设备属于同一个局域网&#xff0c;但…

向日葵远程控制的使用方法

1. 首先在办公电脑上下载安装向日葵远程控制端&#xff0c;注册账号&#xff0c;记录保存“允许控制本机”的“本机识别码”和“本机验证码”&#xff0c;并设置“开机自动启动”&#xff0c;保持向日葵的开启状态&#xff1b; 2. 在家用电脑上下载安装向日葵远程控制端&#…