javascript
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提供了兩種主要方法:
您應該使用??HandlerExceptionResolver來定義全局異常處理策略。
您可以使用@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的微服務變得前所未有的簡單。希望通過這些最佳實踐,您的實施過程不僅會很快,而且從長遠來看也會更加強大和成功。祝您好運!
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Spring Boot 最佳实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 日渐式微什么意思 日渐式微的意思
- 下一篇: 这些Spring面试题,你都会了吗?