Spring Boot 最佳实践

转载自  Spring Boot 最佳实践

Spring Boot是用于开发微服务的最流行的Java框架。在本文中,我将与您分享自2016年以来我在专业开发中使用Spring Boot所采用的最佳实践。本文基于我的个人经验和认可的Spring Boot方面的专家。

在本文中,我将重点介绍Spring Boot特有的实践(大多数时候,也适用于Spring项目)。

以下最佳实践未按特定顺序列出。

1使用自动配置

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>

对于初学者来说,您使用这些经过测试和验证的配置,可以很好地协同工作。

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

@EnableAutoConfiguration(exclude = {ClassNotToAutoconfigure.class})

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

2使用Spring Initializr启动新的Spring Boot项目

Spring Initializr 为您提供了一个简单的方法来启动一个新的Spring Boot项目并使用您可能需要的依赖项加载它。

使用Initializr创建应用程序可确保您获得经过测试和批准的依赖项,这些依赖项适用于Spring自动配置。您甚至可能会发现一些您不了解的新集成。

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

这个是针对高级用户的。

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

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

如果要将库发布到开源,提供Spring Boot配置将极大地简化数千个用户的采用。

4正确构建代码

虽然允许你有很大的自由,但是有一些基本规则值得关注,然后列出你的源代码。

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

  • 将Application.java (您的条目类)保留  在顶级源目录中。

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

5保持@Controller的清洁和专注

控制器应该非常薄。您希望控制器协调和委派,而不是执行实际的业务逻辑。以下是主要做法:

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

  • 控制器不应该执行业务逻辑,而是依赖委托。

  • 控制器应该处理应用程序的HTTP层。这不应该传递给服务。

  • 控制器应该围绕用例/业务能力。

要深入到这里,将开始讨论设计REST API的最佳实践。无论您是否想要使用Spring Boot,都值得学习。

6围绕业务功能构建@Service

服务是Spring Boot的另一个核心概念。我发现最好围绕业务功能/域/用例构建服务,称之为您想要的。

使用称为AccountService,UserService,PaymentService之 类的服务的应用程序比使用DatabaseService,ValidationService,CalculationService等的应用程序更容易处理。

您可以决定使用控制器和服务之间的1对1映射。那将是理想的。这并不意味着,服务不能互相使用!

7使您的数据库成为一个细节 - 从核心逻辑中抽象出来

我曾经不确定如何在Spring Boot中最好地处理数据库交互。在阅读了罗伯特·C·马丁的“整洁的架构”之后,对我来说更加清晰。

您希望从服务中抽象出您的数据库逻辑。理想情况下,您不希望服务知道它正在与哪个数据库通信。有一些抽象可以封装对象的持久性。

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

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

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

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

9支持构造函数注入

保持业务逻辑免受Spring Boot代码攻击的一种方法是依赖于Constructor Injection。@Autowired注释不仅在构造函数上是可选的,而且还可以在没有Spring的情况下轻松实例化bean。

10熟悉并发模型

在Spring Boot中,控制器和服务是默认的Singletons。如果你不小心,这会引入可能的并发问题。您通常也在处理有限的线程池。

11外部化和成熟您的配置管理

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

您可以手动处理配置Spring应用程序。如果您正在处理许多Spring Boot应用程序,则需要使配置管理成熟。

我建议两种主要方法:

  • 使用配置服务器,例如Spring Cloud Config

  • 将所有配置存储在环境变量中(可以基于git存储库进行配置)

这些选项中的任何一个(第二个选项)都要求您在DevOps区域中轻轻一点,但这在微服务领域是可以预期的。

12提供全局异常处理

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

  1. 您应该使用  HandlerExceptionResolver来定义全局异常处理策略。

  2. 您可以使用@ExceptionHandler注释控制器  。如果您想在某些情况下特定,这可能会很有用。

13使用日志框架

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

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

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

14测试你的代码

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

如果有其他人来到你的代码库,很快就会改变任何东西。当您有多个服务相互依赖时,这甚至可能更具风险。

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

15使用测试切片使您的测试更容易,更专注

使用Spring Boot测试代码可能很棘手 - 您需要初始化数据层,连接大量服务,模拟事物......实际上并不是那么难!

答案是 - 使用测试切片。

使用测试切片,您可以根据需要仅连接部分应用程序。这可以为您节省大量时间,并确保您的测试不会与您未使用的内容相关联。

 

总结

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

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

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

相关文章

第三章选择结构(一)

一、boolean 类型&#xff1a; 值只有两个&#xff1a;true(真)和false(假) 二、常用的关系符&#xff1a; > < > < ! 作用&#xff1a;用来比较运算结果&#xff0c;值是boolean类型。. 三、if选择结构的语法&#xff1a; if(boolean){ 代码块 } 含义&#xff1a…

eq,neq,gt,lt等表达式缩写

eq,neq,gt,lt等表达式缩写 eq 等于neq 不等于gt 大于egt 大于等于lt 小于elt 小于等于like LIKEbetween BETWEEN

asp.net core源码飘香:Configuration组件

简介&#xff1a; 这是一个基础组件&#xff0c;是一个统一的配置模型&#xff0c;配置可以来源于配置文件&#xff08;json文件&#xff0c;xml文件&#xff0c;ini文件&#xff09;&#xff0c;内存对象&#xff0c;命令行参数&#xff0c;系统的环境变量又或者是你自己扩展的…

计算机图形橡皮筋实验报告,弹性或橡皮筋技术

橡皮筋是一种在计算机屏幕上绘制线, 折线, 矩形, 圆形和椭圆形等几何图元的流行技术。它已成为图形用户界面(GUI)不可或缺的一部分, 并成为事实上的标准, 并且几乎被所有基于Windows的应用程序普遍接受。用户通过定位其两个端点以通常的方式指定该线。当我们从第一个端点移动到…

2017蓝桥杯省赛---java---C---9(青蛙跳杯子)

题目描述 题目描述 X星球的流行宠物是青蛙&#xff0c;一般有两种颜色&#xff1a;白色和黑色。X星球的居民喜欢把它们放在一排茶杯里&#xff0c;这样可以观察它们跳来跳去。如下图&#xff0c;有一排杯子&#xff0c;左边的一个是空着的&#xff0c;右边的杯子&#xff0c;每…

青客宝团队redis内部分享ppt

Redis&#xff1a;最好的缓存数据库 说Redis是缓存服务&#xff0c;估计有些人会不开心&#xff0c;因为Redis也可以把数据库持久化&#xff0c;但是在大多数情况Redis的竞争力是提供缓存服务。说到缓存服务必然会想到Memcached&#xff0c;因为几年前Memcached是最流行的缓存服…

你知道面试官是如何刷人的吗

转载自 你知道面试官是如何刷人的吗 对于一个公司来说&#xff0c;执行招聘面试事宜是一个耗时耗钱的项目&#xff0c;从顾问公司和人才中介挑选出合适的简历之后&#xff0c;还要花更多的时间找出合适的候选人。有的时候这些机构会向你保证这些人都是 Java 天才、SQL 专家、…

jQuery动画与事件概念以及语法

一、鼠标单击事件&#xff1a; 语法&#xff1a;KaTeX parse error: Expected EOF, got # at position 3: ("#̲div1").click(fu…("#div1").mouseover(function(){//代码}); 三、鼠标移出事件&#xff1a; 语法&#xff1a;KaTeX parse error: Expected E…

spark submit参数及调优

spark submit参数及调优 原文地址 spark submit参数介绍 你可以通过spark-submit --help或者spark-shell --help来查看这些参数。 使用格式: ./bin/spark-submit \ --class <main-class> \ --master <master-url> \ --deploy-mode <deploy-mode> \ …

2020蓝桥杯省赛---java---A---4(七段码)

题目描述 思路分析 代码实现 package lanqiao;public class Main {public static int N10;public static int e[][]new int[N][N];//存储二极管相邻的信息public static int f[]new int[N];//并查集public static int ans0;public static boolean st[]new boolean[N];//true表…

小米无线路由器服务器用户名和密码忘了,小米路由器管理密码忘记了怎么办?...

问&#xff1a;小米路由器管理密码忘记了怎么办&#xff1f;我想修改小米路由器上的配置&#xff0c;在打开miwifi.com的时候&#xff0c;提示需要输入管理密码。但是&#xff0c;我不知道管理密码是多少&#xff0c;忘记了管理密码应该怎么办&#xff1f;答&#xff1a;首先说…

asp.net core源码飘香:Options组件

简介&#xff1a; Options组件是一个小组件&#xff0c;但用的地方很多。它本质是将一个POCO类注册到容器中&#xff08;主要在Startup中作为其他组件的配置功能提供&#xff09;&#xff0c;后续使用的时候就可以通过比如构造函数注入等获取到POCO对象。如果只是为了注入一个P…

DevOps面试问题

转载自 DevOps面试问题 DevOps是一组过程、方法与系统的统称&#xff0c;用于促进开发&#xff08;应用程序/软件工程&#xff09;、技术运营和质量保障&#xff08;QA&#xff09;部门之间的沟通、协作与整合。下面为大家分享DevOps系列的面试问题 持续整合问题 问题一&a…

第五章循环结构(一)

一、while循环&#xff1a; 1.语法&#xff1a;while(循环条件){ //循环操作 } 2.循环条件是一个bolean类型的结果。 3.特点&#xff1a;先判断&#xff0c;后执行&#xff01; 二、程序调试&#xff1a; 1.步骤&#xff1a; 设置断点 单步运行 观察变量 三、 1.i2 等价于ii2; …

bui ajax,BUI 数据交互

BUI里面有3种数据交互.数据请求bui.ajax(option)数据请求 bui.ajax API 数据请求的跨域处理,请查看调试章节.参数: option 是一个对象option.urlType: stringDetail: url地址option.dataType: objectDetail: 请求的参数,默认:{}option.methodType: stringDetail: 默认: GET示例…

SparkSQL性能优化

SparkSQL性能优化 1、设置shuffle过程中的并行度,可以通过spark.sql.shuffle.partitions设置shuffle并行度。&#xff08;在SQLContext.setConf&#xff08;&#xff09;中设置&#xff09;。 2、Hive数据仓库创建的时候&#xff0c;合理设置数据类型&#xff0c;比如设置成I…

微软发布ReactXP:方便开发者构建跨平台应用

说起跨平台开发工具&#xff0c;开发者们最先想到的无外乎是 Cordova 和 Xamarin。但是前者无法提供足够令人满意的性能表现&#xff0c;而后者在 Web 开发上心有余而力不足。所以&#xff0c;微软 Skype 团队基于 React JS 和 React Native 开发了一款全新的跨平台开发工具 —…

2020蓝桥杯省赛---java---A---10( 字串排序)

题目描述 思路分析 set去重 代码实现 package lanqiao;import java.util.*; public class Main {public static Set<String> setnew TreeSet<>();public static void main(String[] args) {Scanner scanner new Scanner(System.in);while (scanner.hasNextLine…

jQuery操作DOM元素案例

直接打开注释即可观察效果&#xff0c;都已经测试通过&#xff01;&#xff01;&#xff01; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>操作DOM元素</title><script src"js/jquery-1.8.3.js" ty…

这些面试中的智力题,你都会了吗

转载自 这些面试中的智力题&#xff0c;你都会了吗 1. 给一个瞎子52张扑克牌&#xff0c;并告诉他里面恰好有10张牌是正面朝上的。要求这个瞎子把牌分成两堆&#xff0c;使得每堆牌里正面朝上的牌的张数一样多。瞎子应该怎么做&#xff1f; 2. 如何用一枚硬币等概率地产生一…