1. 概述
Spring Boot 秉持着一種帶有主觀性的方法,融入了 Spring 生態系統。首次發佈於 2014年中。Spring Boot 經過了大量的開發和改進。其版本 2.0 正在 2018年初準備發佈。
該流行的庫在以下幾個方面幫助我們:
- 依賴管理。通過 starters 和各種包管理器集成
- 自動配置。旨在最大限度地減少 Spring 應用所需的配置量,並傾向於約定優於配置
- 生產就緒功能。例如 Actuator,更好的日誌記錄、監控、指標或各種 PAAS 集成
- 增強的開發體驗。包括多種測試實用程序或使用 spring-boot-devtools 更好的反饋循環
在本文中,我們將探討 Spring Boot 2.0 中的一些變更和功能。我們還將描述這些變更如何幫助我們提高生產力。
2. 依賴項
2.1 Java 基線
Spring Boot 2.x 不再支持 Java 7 及以下版本,Java 8 是最低要求。
它也是第一個支持 Java 9 的版本。 1.x 分支上沒有計劃支持 Java 9。這意味着 如果您希望使用最新的 Java 版本並利用該框架的優勢,Spring Boot 2.x 是您唯一的選擇。
2.2. 原材料清單
隨着 Spring Boot 每一次新發布的版本,Java 生態系統中的各種依賴項也會得到升級。 這在 Boot 中定義為 原材料清單,也稱為 BOM。
在 2.x 版本中也不例外。 雖然無需一一列出,但我們可以查看 spring-boot-dependencies.pom 以瞭解在任何給定時間所使用的版本。
以下是關於最低所需版本的幾個要點:
- Tomcat 的最低支持版本為 8.5
- Hibernate 的最低支持版本為 5.2
- Gradle 的最低支持版本為 3.4
2.3 Gradle 插件
Gradle 插件經過重大改進,並引入了一些破壞性變更。
為了創建胖 JAR 包,bootRepackage Gradle 的任務已被 bootJar 和 bootWar 替換,分別用於構建 JAR 包和 WAR 包。
如果我們想要使用 Gradle 插件運行我們的應用程序,在 1.x 版本中,我們可以執行 gradle bootRun。在 2.x 版本中,bootRun 擴展了 Gradle 的 JavaExec。這意味着我們可以更容易地使用與經典 JavaExec 任務相同的配置。
有時我們發現自己想要利用 Spring Boot BOM。但有時我們不想構建完整的 Boot 應用程序或打包它。
在此方面,值得注意的是,Spring Boot 2.x 將不再默認應用依賴管理插件。
如果我們想要使用 Spring Boot 的依賴管理,應該添加:
apply plugin: 'io.spring.dependency-management'這使我們在上述場景中擁有更大的靈活性,並且減少了配置。
3. 自動配置
3.1. 安全
在 2.x 版本中,安全配置得到了顯著簡化。默認情況下,所有內容都已得到安全保護,包括靜態資源和 Actuator 端點。
一旦用户顯式配置了安全,Spring Boot 的默認配置將不再生效。用户可以將其所有訪問規則配置在一個地方。
這將避免我們與 WebSecurityConfigurerAdapter 排序問題作鬥爭。這些問題通常發生在自定義配置 Actuator 和應用程序安全規則時。
以下是一個混合了 Actuator 和應用程序規則的簡單安全片段:
http.authorizeRequests()
.requestMatchers(EndpointRequest.to("health"))
.permitAll() // Actuator rules per endpoint
.requestMatchers(EndpointRequest.toAnyEndpoint())
.hasRole("admin") // Actuator general rules
.requestMatchers(PathRequest.toStaticResources().atCommonLocations())
.permitAll() // Static resource security
.antMatchers("/**")
.hasRole("user") // Application security rules
// ...3.2. 響應式支持
Spring Boot 2 引入了一組新的啓動器,用於不同的響應式模塊。例如,WebFlux 以及針對 MongoDB、Cassandra 或 Redis 的響應式對應模塊。
同時,WebFlux 也提供了測試實用工具。特別是,我們可以利用 @WebFluxTest。它與舊的 @WebMvcTest 類似,後者最初作為 1.4.0 期間的各種測試 切片 一起引入。
4. 生產就緒功能
Spring Boot 提供了有用的工具,幫助我們創建生產就緒的應用程序。 其中,我們可以利用 Spring Boot Actuator。
Actuator 包含各種工具,用於簡化監控、跟蹤和應用程序的通用自省。 關於 Actuator 的更多詳細信息,請參閲我們之前的文章。
憑藉其 2 個版本 ,該 Actuator 經過了重大改進。 此次迭代側重於簡化自定義。 它還支持其他 Web 技術,包括新的響應式模塊。
4.1. 技術支持
在 Spring Boot 1.x 中,僅支持 Spring-MVC 用於 actuator 端點。但在 2.x 版本中,它變得獨立且可插拔。 Spring Boot 現在自帶對 WebFlux、Jersey 和 Spring-MVC 的支持。
如前所述,JMX 仍然是選項,可以通過配置啓用或禁用。
4.2. 創建自定義端點
新的 actuator 基礎設施具有技術無關性。因此,開發模型從頭開始進行了重新設計。
新的模型還帶來了更大的靈活性和表達能力。
下面我們將演示如何創建一個 Fruits 端點,用於 actuator:
@Endpoint(id = "fruits")
public class FruitsEndpoint {
@ReadOperation
public Map<String, Fruit> fruits() { ... }
@WriteOperation
public void addFruits(@Selector String name, Fruit fruit) { ... }
}在我們的 ApplicationContext 中註冊 FruitsEndpoint 後,就可以使用我們選擇的技術將其暴露為 Web 端點。 此外,根據我們的配置,我們還可以通過 JMX 暴露它。
將端點翻譯為 Web 端點,將會導致以下結果:
- 使用 GET 方法訪問 /application/fruits,返回水果
- 使用 POST 方法訪問 /applications/fruits/{a-fruit},處理該水果,該水果應包含在 payload 中
還有許多其他可能性。我們可以檢索更細粒度的數據。 此外,我們可以為底層技術(例如 JMX 與 Web)定義特定實現。 為了本文的目的,我們將保持其為簡單的介紹,而不會深入細節。
4.3. Actuator 中的安全
在 Spring Boot 1.x 中,Actuator 定義了自己的安全模型。 此安全模型與我們應用程序使用的安全模型不同。
這導致了許多用户在完善安全設置時遇到的問題。
在 2.x 中,安全配置應使用與應用程序其餘部分相同的配置。
默認情況下,大多數 Actuator 端點已禁用。 這與 Spring Security 是否在類路徑中不在關係。 除了 狀態 和信息 之外,所有其他端點都需要由用户啓用。
4.4. 其他重要變更
- 大部分配置屬性現在位於 management.xxx 下,例如:management.endpoints.jmx
- 某些端點採用新的格式,例如:env, flyway 或 liquibase
- 預定義的端點路徑不再可配置
5. 增強開發體驗
5.1. 改進的反饋
Spring Boot 從 1.3 版本開始引入了 <em >開發工具包</em>。
它能夠處理典型的開發問題,例如視圖技術的緩存。它還執行自動重啓和瀏覽器實時刷新。此外,它還允許我們遠程調試應用程序。
在 2.x 版本中,當 <em >開發工具包</em> 重新啓動我們的應用程序時,會打印出一份“差異報告”。該報告會指出發生了哪些更改以及可能對我們的應用程序產生的影響。
例如,我們定義了一個覆蓋 Spring Boot 配置的 JDBC 數據源。
<em >開發工具包</em> 會指示自動配置的數據源不再創建。它還會指出原因,即在 <em >@ConditionalOnMissingBean</em> 中存在不匹配,類型為 <em >javax.sql.DataSource</em>。<em >開發工具包</em> 會在執行重啓後打印出該報告。
5.2. 破壞性變更
由於 JDK 9 相關問題,devtools 已停止支持通過 HTTP 進行遠程調試。
6. 概述
本文介紹了 Spring Boot 2 將帶來的一些變更。
我們討論了依賴項以及 Java 8 成為最低支持版本。
接下來,我們探討了自動配置。我們重點關注了安全性,同時也討論了 actuator 以及它所獲得的諸多改進。
最後,我們談到了開發工具中發生的若干小調整。