天天看點

03-Spring Boot 2.0 新特性詳解

背景

在 3 月 1 号,Spring Boot

2.0.0.RELEASE

正式釋出,這是 Spring Boot1.0 釋出 4 年之後第一次重大修訂,是以有多的新功能和特性值得大家期待!下面帶大家了解下 Spring Boot 2.0 中的新特性。

http://www.54tianzhisheng.cn/2018/03/06/SpringBoot2-new-features/

從 Spring Boot 1.5 更新

由于 Spring Boot 2.0 的改變幅度有點大,是以更新現有的程式可能會比平常更大一些。

如果你還在考慮是否要更新,這裡推薦 DD 的部落格文章:Spring Boot 2.0 正式釋出,升還是不升呢?

如果要更新可以參考我的另外一篇文章:Spring Boot 2.0 遷移指南

如果您目前正在運作較早版本的 Spring Boot,我們強烈建議您在遷移到 Spring Boot 2.0 之前先更新到 Spring Boot 1.5。

新的和值得注意的特性

小技巧:檢查 配置更改日志 來擷取配置更改的完整描述。

起碼 JDK 8 和支援 JDK 9

Spring Boot 2.0 要求 Java 8 作為最低版本。許多現有的 API 已更新,以利用 Java 8 的特性,例如:接口上的預設方法,函數回調以及新的 API,如

javax.time

。如果您目前正在使用 Java 7 或更早版本,則在開發 Spring Boot 2.0 應用程式之前,您需要更新您的 JDK。

Spring Boot 2.0 通過了在 JDK 9 下的測試,可以在 JDK 9 下正常運作,。我們所有的 jar 包都在子產品系統相容性的清單中附帶了自動子產品名稱條目。

第三方庫的更新

Spring Boot 2.0 建立在 Spring Framework 5 之上,并且需要 Spring Framework 5 。你可以通過 What’s New in Spring Framework 5.x 了解 Spring 5 的新特性。并在繼續之前檢視其更新指南 Upgrading to Spring Framework 5.x 。

我們已盡可能更新到其他第三方庫的最新穩定版本。 本版本中一些顯着的依賴性更新包括:

  • Tomcat 8.5
  • Flyway 5
  • Hibernate 5.2
  • Thymeleaf 3

Reactive Spring

Spring 産品組合中的許多項目現在都為開發反應式應用程式提供一流的支援。反應性應用程式是完全異步和非阻塞的。它們旨在用于事件循環執行模型(而不是更傳統的每個請求線程執行模型)。Spring 架構參考文檔中的“Web 反應堆棧”部分為這個主題提供了一個很好的入門。

Spring Boot 2.0 通過自動配置和啟動器 POM 完全支援反應式應用。Spring Boot 的内部本身也在必要時進行了更新,以提供反應性的反應(最明顯的是我們的嵌入式伺服器支援)。

SPRING WEBFLUX&WEBFLUX.FN

Spring WebFlux 是 Spring MVC 的完全非阻塞反應式替代方案。Spring Boot 為基于注釋的 Spring WebFlux 應用程式以及 WebFlux.fn 提供了自動配置,WebFlux.fn 提供了更實用的樣式 API。

要開始,請添加 

spring-boot-starter-webflux

 到 POM,它将提供由嵌入式 Netty 伺服器支援的 Spring WebFlux。

REACTIVE SPRING DATA

在底層技術支援的情況下,Spring Data 還為反應式應用程式提供支援。目前 Cassandra,MongoDB,Couchbase 和 Redis 都有反應式 API 支援。

Spring Boot 包含針對這些技術的特殊 starter-POMs,可為您提供啟動所需的一切。例如,

spring-boot-starter-data-mongodb-reactive

包括對反應性 mongo 驅動程式和項目反應堆的依賴性。

REACTIVE SPRING SECURITY

Spring Boot 2.0 可以充分利用 Spring Security 5.0 來保護您的反應式應用程式。當 Spring Security 位于類路徑中時,會為 WebFlux 應用程式提供自動配置。

使用 WebFlux 的 Spring Security 通路規則可以通過

SecurityWebFilterChain

。如果你之前整合過 Spring MVC 和 Spring Security,應該會感到非常熟悉。有關更多詳細資訊,請參閱 Spring Boot 參考文檔和 Spring Security 文檔。

嵌入式 NETTY 伺服器

由于 WebFlux 不依賴于 Servlet API,我們現在可以首次為 Netty 作為嵌入式伺服器提供支援。該

spring-boot-starter-webflux

 啟動 POM 将拉取 Netty 4.1 和 Ractor Netty 。

注意:您隻能将 Netty 用作反應式伺服器。不提供阻止 servlet API 支援。

HTTP/2 支援

為 Tomcat,Undertow 和 Jetty 提供 HTTP / 2 支援。支援取決于所選的 Web 伺服器和應用程式環境(因為 JDK 8 不支援該協定)。

如何配置 HTTP/2,請參考 官方文檔 。

配置屬性的綁定

在 Spring Boot 2.0 中,用于綁定

Environment

屬性的機制

@ConfigurationProperties

已經完全徹底修改。我們借此機會收緊了松散綁定的規則,并修複了 Spring Boot 1.x 中的許多不一緻之處。

新的

Binder

API 也可以

@ConfigurationProperties

直接在你自己的代碼之外使用。例如,下面将結合到

List

PersonName

對象:

1
2
3
      
List<PersonName> people = Binder.get(environment)
    .bind("my.property", Bindable.listOf(PersonName.class))
    .orElseThrow(IllegalStateException::new);
      

配置源可以像這樣在 YAML 中表示:

1
2
3
4
5
6
      
my:
  property:
  - first-name: zhisheng
    last-name: tian
  - first-name: zhisheng
    last-name: tian
      

有關更新綁定規則的更多資訊,請參閱此Wiki頁面。

配置起源

YAML 檔案和被 Spring Boot 加載的 Properties 檔案現在包含

Origin

資訊,可幫助您跟蹤項目從何處加載的資訊。有些 Spring Boot 特性利用了這個資訊可以在适當的時候展示出來。

例如,

BindException

綁定失敗時抛出的類是一個

OriginProvider

。這意味着原始資訊可以很好地從故障分析器中顯示出來。

另一個例子是

env

執行器端點,當它有可用時包含了原始資訊。下面的代碼片斷顯示該

spring.security.user.name

屬性來自 jar 包中的 application.properties 檔案的第 1行,第 27 列。

1
2
3
4
5
6
7
8
9
      
{
  "name": "applicationConfig: [classpath:/application.properties]",
  "properties": {
    "spring.security.user.name": {
      "value": "user",
      "origin": "class path resource [application.properties]:1:27"
    }
  }
}
      

轉換器支援

Binding 利用了一個新的 

ApplicationConversionService

 類,它提供了一些對屬性綁定特别有用的額外轉換器。最引人注目的是轉換器的

Duration

類型和分隔字元串。

Duration

轉換器允許在任一 ISO-8601 格式中指定的持續時間,或作為一個簡單的字元串(例如

10m

,10 分鐘)。現有的屬性已更改為始終使用

Duration

。該

@DurationUnit

注釋通過設定如果沒有指定所使用的單元確定向後相容性。例如,Spring Boot 1.5 中需要秒數的屬性現在必須

@DurationUnit(ChronoUnit.SECONDS)

確定一個簡單的值,例如

10

實際使用的值

10s

分隔字元串轉換允許您将簡單綁定

String

Collection

Array

不必分割逗号。例如,LDAP 

base-dn

 屬性用 

@Delimiter(Delimiter.NONE)

,是以 LDAP DN(通常包含逗号)不會被錯誤解釋。

Gradle 插件

Spring Boot 的 Gradle 插件已在很大程度上進行了重新編寫,以實作許多重大改進。您可以在其參考文獻和 API 文檔中閱讀關于插件功能的更多資訊。

Spring Boot 現在需要 Gradle 4.x. 如果您要更新使用 Gradle 的項目,請檢視遷移指南。

Kotlin

Spring Boot 2.0 現在包含對 Kotlin 1.2.x 的支援,并提供了

runApplication

 ,一個使用 Kotlin 運作 Spring Boot 應用程式的方法。我們還公開和利用了 Kotlin 對其他 Spring 項目(如Spring Framework,Spring Data 和 Reactor)已添加到其最近版本中的支援。

有關更多資訊,請參閱參考文檔的Kotlin支援部分。

Actuator 改進

在 Spring Boot 2.0 中 Actuator endpoints 有很大的改進。所有 HTTP Actuator endpoints 現在都在該

/actuator

路徑下公開,并且生成的 JSON 有效負載得到了改進。

我們現在也不會在預設情況下暴露很多端點。如果您要更新現有的 Spring Boot 1.5 應用程式,請務必檢視遷移指南并特别注意該

management.endpoints.web.exposure.include

屬性。

ACTUATOR JSON

Spring Boot 2.0 改進了從許多端點傳回的 JSON 有效負載。

現在許多端點都具有更精确地反映底層資料的 JSON。例如,

/actuator/conditions

終端(

/autoconfig

在Spring Boot 1.5中)現在有一個頂級

contexts

密鑰來将結果分組

ApplicationContext

現在還使用 Spring REST Docs 生成了廣泛的 REST API 文檔,并随每個版本釋出。

JERSEY AND WEBFLUX 支援

除了支援 Spring MVC 和 JMX,您現在可以在開發 Jersey 或 WebFlux 應用程式時通路執行器端點。Jersey 支援通過自定義 Jersey 提供

Resource

,WebFlux 使用自定義

HandlerMapping

HYPERMEDIA LINKS

/actuator

端點現在提供了一個 HAL 格式的響應提供連結到所有活動端點(即使你沒有 Spring HATEOAS 在classpath)。

ACTUATOR @ENDPOINTS

為了支援 Spring MVC,JMX,WebFlux 和 Jersey,我們為 Actuator @Endpoints 開發了一種新的程式設計模型。該

@Endpoint

注解可以與

@ReadOperation

@WriteOperation

 和 

@DeleteOperation

 組合使用開發 endpoints。

您還可以使用

@EndpointWebExtension

@EndpointJmxExtension

編寫技術特定的增強功能到 endpoints。詳細資訊請參閱更新的參考文檔。

MICROMETER

Spring Boot 2.0 不再提供自己的名額 API。相反,我們依靠 micrometer.io 來滿足所有應用程式監視需求。

Micrometer 包括尺寸名額的支援,當與尺寸監測系統配對時,尺寸名額可以有效通路特定的指定度量标準,并且可以在其尺寸範圍内向下鑽取。

名額可以輸出到各種系統和開箱即用的 Spring Boot 2.0,為 Atlas,Datadog,Ganglia,Graphite,Influx,JMX,New Relic,Prometheus,SignalFx,StatsD 和 Wavefront 提供支援。另外還可以使用簡單的記憶體中度量标準。

內建随 JVM 名額(包括 CPU,記憶體,線程和 GC),Logback,Tomcat,Spring MVC&提供

RestTemplate

有關更多詳細資訊,請參閱參考文檔的更新“名額”部分。

資料支援

除了上面提到的 

Reactive Spring Data

 支援外,在資料領域還進行了其他一些更新和改進。

HIKARICP

Spring Boot 2.0 中的預設資料庫池技術已從 Tomcat Pool 切換到 HikariCP。我們發現 Hakari 提供了卓越的性能,我們的許多使用者更喜歡 Tomcat Pool。

初始化

資料庫初始化邏輯在 Spring Boot 2.0 中已經合理化。Spring Batch,Spring Integration,Spring Session 和 Quartz的初始化現在僅在使用嵌入式資料庫時才會預設發生。該

enabled

屬性已被替換為更具表現力枚舉。例如,如果你想一直執行 Spring Batch 的初始化,您可以設定

spring.batch.initialize-schema=always

如果 Flyway 或 Liquibase 正在管理您的 DataSource 的模式,并且您正在使用嵌入式資料庫,Spring Boot 現在會自動關閉 Hibernate 的自動 DDL 功能。

JOOQ

Spring Boot 2.0 現在基于 DataSource 自動檢測 JOOQ 方言(類似于為 JPA 方言所做的)。

@JooqTest

是新引入的注解用來簡化那些隻有 JOOQ 必須被使用的測試。

JDBCTEMPLATE

Spring Boot 自動配置的 

JdbcTemplate

 現在可以通過 

spring.jdbc.template

 屬性進行自定義。此外,

NamedParameterJdbcTemplate

自動配置的内容會重用

JdbcTemplate

SPRING DATA WEB 配置

Spring Boot 公開了一個新的

spring.data.web

配置名稱空間,可以輕松配置分頁和排序。

INFLUXDB

Spring Boot 現在自動配置開源時間序列資料庫 InfluxDB。要啟用 InfluxDB 支援,您需要設定一個

spring.influx.url

屬性,并将其包含

influxdb-java

在您的類路徑中。

FLYWAY/LIQUIBASE 靈活配置

如果僅提供自定義

url

user

屬性,則 Flyway 和 Liquibase 的自動配置現在将重用标準資料源屬性,而不是忽略它們。這使您可以建立一個自定義的資料源,僅用于所需資訊的遷移。

HIBERNATE

現在支援自定義 Hibernate 命名政策。對于進階場景,現在可以在上下文中定義

ImplicitNamingStrategy

PhysicalNamingStrategy

使用正常 bean。

現在也可以通過公開

HibernatePropertiesCustomizer

bean 來更加細緻地定制 Hibernate 使用的屬性。

MONGODB 用戶端自定義

現在可以通過定義一個類型的 bean 來為 Spring Boot 自動配置的 Mongo 用戶端應用進階定制

MongoClientSettingsBuilderCustomizer

REDIS

現在可以使用

spring.cache.redis.*

屬性配置 Redis 的緩存預設值。

Web

除了上面提到的 WebFlux 和 WebFlux.fn 支援之外,還在開發 Web 應用程式時進行了以下改進。

上下文路徑記錄

當使用嵌入式容器時,當您的應用程式啟動時,上下文路徑将與 HTTP 端口一起記錄。例如,嵌入式 Tomcat 現在看起來像這樣:

WEB過濾器初始化

Web 過濾器現在在所有支援的容器上急切地初始化。

THYMELEAF

Thymeleaf 初始化現在包括

thymeleaf-extras-java8time

,提供

javax.time

類型支援。

JSON 支援

新的

spring-boot-starter-json

起始者收集必要的位以讀取和寫入 JSON。它不僅提供了

jackson-databind

與Java8 工作時,也是有用的子產品:

jackson-datatype-jdk8

jackson-datatype-jsr310

jackson-module-parameter-names

。這個新的起動器現在被用于

jackson-databind

之前定義的地方。

如果您更喜歡 Jackson 之外的其他産品,我們對 GSON 的支援在 Spring Boot 2.0 已經大大提高。我們還引入了對 JSON-B 的支援(包括 JSON-B 測試支援)。

Quartz

自動配置支援目前包含了 Quartz Scheduler。我們還添加了新的

spring-boot-starter-quartz

 初始化 POM。

您可以使用記憶體

JobStores

中或完整的基于 JDBC 的存儲。所有

JobDetail

Calendar

Trigger

從你的 Spring應用程式上下文豆将自動注冊

Scheduler

有關更多詳細資訊,請閱讀參考文檔的新“Quartz Scheduler”部分。

測試

對 Spring Boot 2.0 中提供的測試支援進行了一些補充和調整:

  • @WebFluxTest

    已添加新注釋以支援 WebFlux 應用程式的“切片”測試。
  • Converter

    GenericConverter

    豆類現在自動掃描

    @WebMvcTest

    @WebFluxTest

  • @AutoConfigureWebTestClient

    已經添加了一個注釋來提供一個

    WebTestClient

    bean 供測試使用。注釋會自動應用于

    @WebFluxTest

    測試。
  • 增加了一個新的

    ApplicationContextRunner

    測試實用程式,可以很容易地測試您的自動配置。我們已将大部分内部測試套件移至此新模型。詳細資訊請參閱更新的文檔。

其它

除了上面列出的變化外,還有很多小的調整和改進,包括:

  • @ConditionalOnBean

    現在在确定是否滿足條件時使用邏輯

    AND

    而不是邏輯

    OR

  • 無條件類現在包含在自動配置報告中。
  • spring

    CLI 應用程式現在包括

    encodepassword

    可用于建立 Spring Security 的相容散列密碼指令。
  • 計劃任務(即 

    @EnableScheduling

    )可以使用

    scheduledtasks

    執行器端點進行審查。
  • loggers

    驅動器終端現在允許你重新設定一個記錄器級别為它的預設。
  • Spring Session 使用者現在可以通過

    sessions

    執行器端點查找和删除會話。
  • 使用

    spring-boot-starter-parent

    現在基于 Maven 的應用程式

    -parameters

    預設使用标志。
  • 我們的建構現在使用 concourse 的 CI 和我們的項目 POM 檔案已被重構,使它們更簡單的。

動畫 ASCII 藝術

最後,為了好玩,Spring Boot 2.0 現在支援動畫 GIF 橫幅。

繼續閱讀