一、Spring Boot 概述

1、Spring Boot 簡介

Spring Boot 是 Spring 開源組織下的子項目,是 Spring 組件一站式解決方案,主要是簡化了使用 Spring 的難度,簡省了繁重的配置,提供了各種啓動器,開發者能快速上手。

官方網站:http://projects.spring.io/spring-boot/

GitHub源碼:https://github.com/spring-projects/spring-boot

2、Spring Boot 特點

為基於 Spring 的開發提供更快的入門體驗開箱即用,沒有代碼生成,也無需 xml 配置。同時也可以修改默認值來滿足特定的需求。

提供了一些大型項目中常見的非功能性特性,如嵌入式服務器、安全、指標,健康檢測、外部配置等 SpringBoot 不是對 Spring 功能上的增強,而是提供了一種快速使用 Spring 的方式。

3、Spring Boot 優點

Spring Boot 優點如下:

  1. 獨立運行:Spring Boot 而且內嵌了各種 Servlet 容器,Tomcat、Jetty等,現在不再需要打成 war 包部署到容器中,Spring Boot 只要打成一個可執行的 jar 包就能獨立運行,所有的依賴包都在一個 jar 包內。
  2. 簡化部署:spring-boot-starter-web 啓動器自動依賴其他組件,簡少了 Maven 的配置。
  3. 自動配置:Spring Boot 能根據當前類路徑下的類、jar 包來自動配置 bean,如添加一個 ‘spring-boot-starter-web’ 啓動器就能擁有 web 的功能,無需其他配置。
  4. 無代碼生成及 xml 配置:Spring Boot 配置過程中無代碼生成,也無需 xml 配置文件就能完成所有配置工作,這一切都是藉助於條件註解完成的,這也是 Spring4.x 的核心功能之一。
  5. 應用監控:Spring Boot 提供一系列端點可以監控服務及應用,做健康檢測。
4、Spring Boot 缺點

Spring Boot 缺點如下:

Spring Boot 雖然上手很容易,但如果你不瞭解其核心技術及流程,所以一旦遇到問題就很棘手,而且現在的解決方案也不是很多,需要一個完善的過程。

二、Spring Boot 約定優於配置

1、對於“約定優於配置”的理解

約定優於配置(convention over configuration),也稱作按約定編程,是一種軟件設計範式,旨在減少軟件開發人員需做出決定的數量,活得簡單的好處,而又不失靈活性。開發人員僅僅需要規定應用中不符合約定的部分。

  • 約定大於配置,約定好於配置,習慣大於配置等。但它們都表明了一個意思,並不是説零配置。或者説零配置並不是完全沒有配置,而是通過約定來減少配置;
  • 系統,類庫,框架應該提供有合理的默認值,而非要求提供不必要的配置。使用該框架提供的默認值,會讓開發人員工作起來效率更快。

Ps:Spring 在推動 約定優於配置 這一設計理念,從 Spring 的註解版本就已經開始了。引入註解就是為了減少一些默認配置,引入註解也就代表着簡化配置的開始,官方説基於 Spring 的基礎就是這個事實。

2、對於“約定優於配置”的體現

在我們真實去使用 Spring Boot 進行開發時,就能深刻體會到其中“約定優於配置”的這一特點。往往是我們引入一個組件依賴,加個配置,這個組件就生效了,非常便利。

比如我們常用的 Redis, 在 Spring Boot 中就是這樣使用的:

# 引入 Maven 依賴

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

# 配置 .yml 文件

spring:
  redis:
    host: localhost
    port: 6379
    password: pwd1234

# 使用 Redis

@Autowired
private RedisTemplate redisTemplate;

可以看到就這樣簡單兩步,中間沒有做任何事情,就可以搞定 Redis 的引入(Ps:關於 Spring Boot 是如何做到這一點的,會在後面介紹)

三、Spring Boot 演進之路

1、Spring Boot 1.0 和 2.0
  • 從 2.0 版本開始 WebMvcConfigurerAdapter 抽象類已經過時。直接繼承 WebMvcConfigurer 接口然後實現他的 default 方法即可。因為 SpringBoo t的 2.0 及其以上版本最低支持Java 8,而 Java 8 中有個新特性就是 default 關鍵字。

WebMvcConfigurerAdapter 可以用 WebMvcConfigurationSupport 替代,但是不推薦使用 WebMvcConfigurationSupport 這個類會全面接管對 SpringMVC 的配置,即SpringBoot 對 SpringMVC 的自動配置全部失效,只使用用户對 SpringMVC的 配置。

  • SpringBoot1.X 配置的攔截器對靜態資源是默認放行的,而 SpringBoot 2.X 版本的攔截器不會對靜態資源默認放行,也會進行攔截。如果想要使用靜態資源就必須排除靜態資源的請求路徑。
2、Spring Boot 2.1
  • 優化應用程序啓動速度,啓動時佔用的內存更少。在 Spring Data JPA 中設置 spring.data.JPA.repositori.bootstrap.bootstrap-mode=deferred 時,Hibernate 將在單獨的線程啓動,而應用程序的其餘組件將會並行啓動。
  • 支持 Java11 並且兼容Java8。
  • 提供了應用程序緩存管理信息和提供Spring集成組件的圖表信息。
3、Spring Boot 2.2
  • Spring Boot 2.2.0 的性能獲得了很大的提升。現在,應用程序啓動速度更快,並且消耗的內存更少。這在具有非常嚴格的內存約束的環境中特別有用。
  • 現在可以通過 spring.main.lazy-initialization 屬性啓用全局延遲初始化,以減少啓動時間。但是在進行任何延遲的初始化時,HTTP 請求的處理可能需要更長的時間;通常在啓動時會發生的故障現在在啓動後才會出現。
  • 支持 Java 13,同時仍與 Java 11 和 8 兼容
  • 配置屬性現在支持基於構造函數的綁定,該綁定使 @ConfigurationProperties 註釋的類不可變。可以通過使用 @ConstructorBinding 註釋 @ConfigurationProperties 類或其構造函數之一來啓用基於構造函數的綁定。可以在配置屬性綁定提供的構造函數參數上使用 @DefaultValue 和 @DateTimeFormat 之類的註釋。
4、Spring Boot 2.3

# 正常(優雅)停機

所有四個嵌入式Web服務器(Jetty,Reactor Netty,Tomcat和Undertow)以及響應式和基於Servlet的Web應用程序均支持正常關機。它作為關閉應用程序上下文的一部分發生,並在停止SmartLifecyclebean 的最早階段執行。此停止處理使用一個超時,該超時提供一個寬限期,在此寬限期內,現有請求將被允許完成,但新請求將不被允許。不允許新請求的確切方式因所使用的Web服務器而異。Jetty,Reactor Netty和Tomcat將停止在網絡層接受請求。Undertow將接受請求,但會立即以服務不可用(503)響應進行響應。

當我們流量請求到此接口執行業務邏輯的時候,若服務端此時執行關機 (kill),spring boot 默認情況會直接關閉容器(tomcat 等),導致此業務邏輯執行失敗。在一些業務場景下:會出現數據不一致的情況,事務邏輯不會回滾。使用Tomcat正常關機需要Tomcat 9.0.33或更高版本。

# 分成 jar 包

重新打包的 jar 分別在 BOOT-INF/classes 和中包含應用程序的類和依賴項 BOOT-INF/lib。對於需要從 jar 的內容中構建 docker 映像的情況,能夠進一步分隔這些目錄,以便可以將它們寫入不同的層是很有用的。

Buildpacks 打鏡像包會使用緩存的,如果這一層沒變那就不用重新打這一層,只需要重新打包修改過的層,這樣一來,如果你只修改了 application 中的內容,比如新加了 Controller 或者配置文件等,那麼只需要重新打包這一層,也就是幾 K,幾十 K 不會很大,這樣一來打包速度就很快了,要不然一個上百兆的鏡像包也得需要一段時間。

5、Spring Boot 2.4

# 自動分析瘦身

Spring Boot 項目最終構建處理 JAR 包大小一直是個詬病,需要把所有依賴包內置最終輸出可運行的 jar。 當然可以使用其他的插件擴展 實現依賴 JAR 和 可運行 jar 分離可以參考 slot-maven-plugin, 但此種方法治標不治本並不能減少原有依賴的 JAR 的大小。

Spring Boot 2.4 提供對構建輸出 JAR 分析自動瘦身的功能,自動在構建輸出可運行 JAR 時刪除 empty starter dependencies。

6、Spring Boot 3.0

Spring Boot 3 最大的變化是決定使用 Java 17 作為最低版本。要求 Java 17 和更新版本是一個重大舉措,Spring 將成為第一個需要此最新 LTS 版本的主要框架。

Spring Boot 3 還需要 Spring Framework 6。對於 Gradle 用户,Spring Boot 3 需要 Gradle 7.3 或更高版本。

其餘值得注意的依賴升級可以分為兩組,Spring 項目和第三方庫。