Spring Boot 学习总结

Spring Boot 是最流行的用于开发微服务的Java框架。在本文中主要分享的是专业开发中使用Spring Boot所采用的最佳实践。这些内容是基于个人经验和一些熟知的SpringBoot专家的文章。

在文中重点介绍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>

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

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

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

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

@EnableAutoConfiguration(exclude = {ClassNotToAutoconfigure.class})

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

3、使用Spring Initializr开始新项目

Spring Initializr(https://start.spring.io/)提供了一个超级简单的方法来创建一个新的Spring Boot项目,并且根据你的需要来加载可能使用的依赖。

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

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

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

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

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

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

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

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

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

3:建议将控制器和服务放在以功能为导向的模块中,但是这是可选的。一些非常好的开发人员建议将所有控制器放在一起。

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

Controller应该非常简单、你可以在此处阅读有关GRASP中有关控制器模式部分的说明:

你希望控制器作为协调和委派的角色,而不是执行实际的业务逻辑。以下是主要做法:

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

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

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

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

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

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

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

在应用中设计名称类似AccountService,UserService这样的服务,比起想DataBaseSeivice,ValidationService这样的会更合适一些。

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

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

我之前还不确定如何在Spring Boot中最好的处理数据库交互。在阅读了罗伯特.C.马丁的ClearArchitecture(clean Architecture)之后,这对我来说清晰多了。

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

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

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

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

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

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

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

11、熟悉并发模式

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

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

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

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

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

推荐两种主要方法:

1:使用配置服务器,例如Spring Cloud Config;

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

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

13、提供全局异常处理

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

1:你应该使用HandlerExceptionResolver定义全局处理异常的策略。

2:你也可以在控制器上添加@ExceptionHandler注解,这在某些特定场景下使用可能会很有用。

14、使用日志框架

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

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

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

15、测试你的代码

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

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

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

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

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

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

总结

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值