专栏名称: java那些事
分享java开发中常用的技术,分享软件开发中各种新技术的应用方法。每天推送java技术相关或者互联网相关文章。关注“java那些事”,让自己做一个潮流的java技术人!《java程序员由笨鸟到菜鸟》系列文章火热更新中。
目录
相关文章推荐
芋道源码  ·  裁员天花板:全员降薪40%,“闲置员工” ... ·  21 小时前  
芋道源码  ·  MySQL数据实时同步到Elasticsea ... ·  2 天前  
芋道源码  ·  300 秒到 4 秒,如何将 MySQL ... ·  2 天前  
芋道源码  ·  某公司新招了个牛逼的架构师后... ·  2 天前  
51好读  ›  专栏  ›  java那些事

Java程序员学习Spring Boot,先看看这16条实践总结吧~

java那些事  · 公众号  · Java  · 2018-12-14 16:00

正文


Spring Boot是最流行的用于开发微服务的Java框架。在本文主要分享的是在专业开发中使用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开始新项目


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


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


使用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-oriented_design)#Controller。


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

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

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

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

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


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


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



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


在应用中设计名称类似AccountService, UserService, PaymentService这样的服务,比起像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中,Controller和Service是默认是单例。如果你不小心,这会引入可能的并发问题。 你通常也在处理有限的线程池。请熟悉这些概念。


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



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


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

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


推荐两种主要方法:

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

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


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


13、提供全局异常处理







请到「今天看啥」查看全文