日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

老司机给我们解读 Spring Boot 最流行的 16 条实践

發(fā)布時間:2024/4/11 javascript 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 老司机给我们解读 Spring Boot 最流行的 16 条实践 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

點擊上方“朱小廝的博客”,選擇“設(shè)為星標(biāo)”

后臺回復(fù)"書",獲取個xxx

Spring Boot 是最流行的用于開發(fā)微服務(wù)的 Java 框架。在本文中,我將與你分享自 2016 年以來我在專業(yè)開發(fā)中使用 Spring Boot 所采用的最佳實踐。這些內(nèi)容是基于我的個人經(jīng)驗和一些熟知的 Spring Boot 專家的文章。

在本文中,我將重點介紹 Spring Boot 特有的實踐(大多數(shù)時候,也適用于 Spring 項目)。以下依次列出了最佳實踐,排名不分先后。

1、使用自定義 BOM 來維護第三方依賴

這條實踐是我根據(jù)實際項目中的經(jīng)歷總結(jié)出的。

Spring Boot 項目本身使用和集成了大量的開源項目,它幫助我們維護了這些第三方依賴。但是也有一部分在實際項目使用中并沒有包括進(jìn)來,這就需要我們在項目中自己維護版本。如果在一個大型的項目中,包括了很多未開發(fā)模塊,那么維護起來就非常的繁瑣。

怎么辦呢?事實上,Spring IO Platform 就是做的這個事情,它本身就是 Spring Boot 的子項目,同時維護了其他第三方開源庫。我們可以借鑒 Spring IO Platform 來編寫自己的基礎(chǔ)項目 platform-bom,所有的業(yè)務(wù)模塊項目應(yīng)該以 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 的一部分,它可以簡化你的代碼并使之工作。當(dāng)在類路徑上檢測到特定的 jar 文件時,自動配置就會被激活。

使用它的最簡單方法是依賴 Spring Boot Starters。因此,如果你想與 Redis 進(jìn)行集成,你可以首先包括:

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

如果你想與 MongoDB 進(jìn)行集成,需要這樣:

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

借助于這些 starters,這些繁瑣的配置就可以很好地集成起來并協(xié)同工作,而且它們都是經(jīng)過測試和驗證的。這非常有助于避免可怕的 Jar 地獄。

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

通過使用以下注解屬性,可以從自動配置中排除某些配置類:

@EnableAutoConfiguration(exclude?=?{ClassNotToAutoconfigure.class})

但只有在絕對必要時才應(yīng)該這樣做。

有關(guān)自動配置的官方文檔可在此處找到:

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 提供了一個超級簡單的方法來創(chuàng)建一個新的 Spring Boot 項目,并根據(jù)你的需要來加載可能使用到的依賴。

https://start.spring.io/

使用 Initializr 創(chuàng)建應(yīng)用程序可確保你獲得經(jīng)過測試和驗證的依賴項,這些依賴項適用于 Spring 自動配置。你甚至可能會發(fā)現(xiàn)一些新的集成,但你可能并沒有意識到這些。

4、考慮為常見的組織問題創(chuàng)建自己的自動配置

這一條也來自 Josh Long(Spring Advocate,@starbuxman)——這個實踐是針對高級用戶的。

如果你在一個嚴(yán)重依賴 Spring Boot 的公司或團隊中工作,并且有共同的問題需要解決,那么你可以創(chuàng)建自己的自動配置。

這項任務(wù)涉及較多工作,因此你需要考慮何時獲益是值得投入的。與多個略有不同的定制配置相比,維護單個自動配置更容易。

如果將這個提供 Spring Boot 配置以開源庫的形式發(fā)布出去,那么將極大地簡化數(shù)千個用戶的配置工作。

5、正確設(shè)計代碼目錄結(jié)構(gòu)

盡管允許你有很大的自由,但是有一些基本規(guī)則值得遵守來設(shè)計你的源代碼結(jié)構(gòu)。

避免使用默認(rèn)包。確保所有內(nèi)容(包括你的入口點)都位于一個名稱很好的包中,這樣就可以避免與裝配和組件掃描相關(guān)的意外情況;

將 Application.java(應(yīng)用的入口類)保留在頂級源代碼目錄中;

我建議將控制器和服務(wù)放在以功能為導(dǎo)向的模塊中,但這是可選的。一些非常好的開發(fā)人員建議將所有控制器放在一起。不論怎樣,堅持一種風(fēng)格!

6、保持 @Controller 的簡潔和專注

Controller 應(yīng)該非常簡單。你可以在此處閱讀有關(guān) GRASP 中有關(guān)控制器模式部分的說明。你希望控制器作為協(xié)調(diào)和委派的角色,而不是執(zhí)行實際的業(yè)務(wù)邏輯。以下是主要做法:

https://en.wikipedia.org/wiki/GRASP_(object-oriented_design)#Controller

控制器應(yīng)該是無狀態(tài)的!默認(rèn)情況下,控制器是單例,并且任何狀態(tài)都可能導(dǎo)致大量問題;

控制器不應(yīng)該執(zhí)行業(yè)務(wù)邏輯,而是依賴委托;

控制器應(yīng)該處理應(yīng)用程序的 HTTP 層,這不應(yīng)該傳遞給服務(wù);

控制器應(yīng)該圍繞用例 / 業(yè)務(wù)能力來設(shè)計。

要深入這個內(nèi)容,需要進(jìn)一步地了解設(shè)計 REST API 的最佳實踐。無論你是否想要使用 Spring Boot,都是值得學(xué)習(xí)的。

7、圍繞業(yè)務(wù)功能構(gòu)建 @Service

Service 是 Spring Boot 的另一個核心概念。我發(fā)現(xiàn)最好圍繞業(yè)務(wù)功能 / 領(lǐng)域 / 用例(無論你怎么稱呼都行)來構(gòu)建服務(wù)。

在應(yīng)用中設(shè)計名稱類似AccountService, UserService, PaymentService這樣的服務(wù),比起像DatabaseService、ValidationService、CalculationService這樣的會更合適一些。

你可以決定使用 Controler 和 Service 之間的一對一映射,那將是理想的情況。但這并不意味著,Service 之間不能互相調(diào)用!

8、使數(shù)據(jù)庫獨立于核心業(yè)務(wù)邏輯之外

我之前還不確定如何在 Spring Boot 中最好地處理數(shù)據(jù)庫交互。在閱讀了羅伯特 ·C· 馬丁的 “Clear Architecture” 之后,對我來說就清晰多了。

你希望你的數(shù)據(jù)庫邏輯于服務(wù)分離出來。理想情況下,你不希望服務(wù)知道它正在與哪個數(shù)據(jù)庫通信,這需要一些抽象來封裝對象的持久性。

羅伯特 C. 馬丁強烈地說明,你的數(shù)據(jù)庫是一個 “細(xì)節(jié)”,這意味著不將你的應(yīng)用程序與特定數(shù)據(jù)庫耦合。過去很少有人會切換數(shù)據(jù)庫,我注意到,使用 Spring Boot 和現(xiàn)代微服務(wù)開發(fā)會讓事情變得更快。

9、保持業(yè)務(wù)邏輯不受 Spring Boot 代碼的影響

考慮到 “Clear Architecture” 的教訓(xùn),你還應(yīng)該保護你的業(yè)務(wù)邏輯。將各種 Spring Boot 代碼混合在一起是非常誘人的…… 不要這樣做。如果你能抵制誘惑,你將保持你的業(yè)務(wù)邏輯可重用。

部分服務(wù)通常成為庫。如果不從代碼中刪除大量 Spring 注解,則更容易創(chuàng)建。

10、推薦使用構(gòu)造函數(shù)注入

這一條實踐來自 Phil Webb(Spring Boot 的項目負(fù)責(zé)人, @phillip_webb)。

保持業(yè)務(wù)邏輯免受 Spring Boot 代碼侵入的一種方法是使用構(gòu)造函數(shù)注入。不僅是因為@Autowired注解在構(gòu)造函數(shù)上是可選的,而且還可以在沒有 Spring 的情況下輕松實例化 bean。

11、熟悉并發(fā)模型

我寫過的最受歡迎的文章之一是 “介紹 Spring Boot 中的并發(fā)”。我認(rèn)為這樣做的原因是這個領(lǐng)域經(jīng)常被誤解和忽視。如果使用不當(dāng),就會出現(xiàn)問題。

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

在 Spring Boot 中,Controller 和 Service 是默認(rèn)是單例。如果你不小心,這會引入可能的并發(fā)問題。你通常也在處理有限的線程池。請熟悉這些概念。

如果你正在使用新的 WebFlux 風(fēng)格的 Spring Boot 應(yīng)用程序,我已經(jīng)解釋了它在 “Spring’s WebFlux/Reactor Parallelism and Backpressure” 中是如何工作的。

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

這一點超出了 Spring Boot,雖然這是人們開始創(chuàng)建多個類似服務(wù)時常見的問題……

你可以手動處理 Spring 應(yīng)用程序的配置。如果你正在處理多個 Spring Boot 應(yīng)用程序,則需要使配置管理能力更加強大。

我推薦兩種主要方法:

使用配置服務(wù)器,例如 Spring Cloud Config;

將所有配置存儲在環(huán)境變量中(可以基于 git 倉庫進(jìn)行配置)。

這些選項中的任何一個(第二個選項多一些)都要求你在 DevOps 更少工作量,但這在微服務(wù)領(lǐng)域是很常見的。

13、提供全局異常處理

你真的需要一種處理異常的一致方法。Spring Boot 提供了兩種主要方法:

你應(yīng)該使用 HandlerExceptionResolver 定義全局異常處理策略;

你也可以在控制器上添加 @ExceptionHandler 注解,這在某些特定場景下使用可能會很有用。

這與 Spring 中的幾乎相同,并且 Baeldung 有一篇關(guān)于 REST 與 Spring 的錯誤處理的詳細(xì)文章,非常值得一讀。

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

14、使用日志框架

你可能已經(jīng)意識到這一點,但你應(yīng)該使用 Logger 進(jìn)行日志記錄,而不是使用 System.out.println() 手動執(zhí)行。這很容易在 Spring Boot 中完成,幾乎沒有配置。只需獲取該類的記錄器實例:

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

這很重要,因為它可以讓你根據(jù)需要設(shè)置不同的日志記錄級別。

15、測試你的代碼

這不是 Spring Boot 特有的,但它需要提醒——測試你的代碼!如果你沒有編寫測試,那么你將從一開始就編寫遺留代碼。

如果有其他人使用你的代碼庫,那邊改變?nèi)魏螙|西將會變得危險。當(dāng)你有多個服務(wù)相互依賴時,這甚至可能更具風(fēng)險。

由于存在 Spring Boot 最佳實踐,因此你應(yīng)該考慮將 Spring Cloud Contract 用于你的消費者驅(qū)動契約,它將使你與其他服務(wù)的集成更容易使用。

16、使用測試切片讓測試更容易,并且更專注

這一條實踐來自 Madhura Bhave(Spring 開發(fā)者, @madhurabhave23)。

使用 Spring Boot 測試代碼可能很棘手——你需要初始化數(shù)據(jù)層,連接大量服務(wù),模擬事物…… 實際上并不是那么難!答案是使用測試切片。

使用測試切片,你可以根據(jù)需要僅連接部分應(yīng)用程序。這可以為你節(jié)省大量時間,并確保你的測試不會與未使用的內(nèi)容相關(guān)聯(lián)。來自 spring.io 的一篇名為 Custom test slice with Spring test 1.4 的博客文章解釋了這種技術(shù)。

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

總結(jié)

感謝 Spring Boot,編寫基于 Spring 的微服務(wù)正變得前所未有的簡單。我希望通過這些最佳實踐,你的實施過程不僅會變得很快,而且從長遠(yuǎn)來看也會更加強大和成功。

來源 |?http://e4developer.com/2018/08/06/

想知道更多?描下面的二維碼關(guān)注我

后臺回復(fù)"技術(shù)",加入技術(shù)群

當(dāng)當(dāng)實付滿200-40優(yōu)惠碼:NBHH2P

【精彩推薦】

  • 超清晰的DNS入門指南

  • 深入理解Java Stream流水線

  • 如何用ELK搭建TB級的日志系統(tǒng)

  • 深度好文:Linux系統(tǒng)內(nèi)存知識

  • 日志系統(tǒng)新貴Loki,確實比笨重的ELK輕

  • 日志采集系統(tǒng)都用到哪些技術(shù)?

  • 面試官:為什么HashMap的加載因子是0.75?

  • 原創(chuàng)|OpenAPI標(biāo)準(zhǔn)規(guī)范

  • Linux系統(tǒng)內(nèi)存知識總結(jié)

  • 深度好文|奈飛微服務(wù)架構(gòu)解析

  • 耗時3天,上億數(shù)據(jù)如何做到秒級查詢

點個贊+在看,少個 bug?????

總結(jié)

以上是生活随笔為你收集整理的老司机给我们解读 Spring Boot 最流行的 16 条实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。