Spring Boot 2.0 新特性詳解

圖片

背景

在 3 月 1 號,Spring Boot2.0.0.RELEASE正式發佈,這是 Spring Boot1.0 發佈 4 年以後第一次重大修訂,所以有多的新功能和特性值得你們期待!下面帶你們瞭解下 Spring Boot 2.0 中的新特性。java

從 Spring Boot 1.5 升級

因爲 Spring Boot 2.0 的改變幅度有點大,因此升級現有的程序可能會比日常更大一些。react

若是你還在考慮是否要升級,這裏推薦 DD 的博客文章:Spring Boot 2.0 正式發佈,升仍是不升呢?git

若是要升級能夠參考我明天要發佈的文章:Spring Boot 2.0 遷移指南github

若是您目前正在運行較早版本的 Spring Boot,咱們強烈建議您在遷移到 Spring Boot 2.0 以前先升級到 Spring Boot 1.5。web

新的和值得注意的特性

小技巧:檢查 配置更改日誌 來獲取配置更改的完整描述。redis

起碼 JDK 8 和支持 JDK 9

Spring Boot 2.0 要求 Java 8 做爲最低版本。許多現有的 API 已更新,以利用 Java 8 的特性,例如:接口上的默認方法,函數回調以及新的 API,如javax.time。若是您當前正在使用 Java 7 或更早版本,則在開發 Spring Boot 2.0 應用程序以前,您須要升級您的 JDK。spring

Spring Boot 2.0 經過了在 JDK 9 下的測試,能夠在 JDK 9 下正常運行,。咱們全部的 jar 包都在模塊系統兼容性的清單中附帶了自動模塊名稱條目。mongodb

第三方庫的升級

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 中的許多不一致之處。

新的BinderAPI 也能夠@ConfigurationProperties直接在你本身的代碼以外使用。例如,下面將結合到ListPersonName對象:

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

配置源能夠像這樣在 YAML 中表示:

1my:
2  property:
3  - first-name: zhisheng
4    last-name: tian
5  - first-name: zhisheng
6    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  "name": "applicationConfig: [classpath:/application.properties]",
3  "properties": {
4    "spring.security.user.name": {
5      "value": "user",
6      "origin": "class path resource [application.properties]:1:27"
7    }
8  }
9}

轉換器支持

Binding 利用了一個新的 ApplicationConversionService 類,它提供了一些對屬性綁定特別有用的額外轉換器。最引人注目的是轉換器的Duration類型和分隔字符串。

Duration轉換器容許在任一 ISO-8601 格式中指定的持續時間,或做爲一個簡單的字符串(例如10m,10 分鐘)。現有的屬性已更改成始終使用Duration。該@DurationUnit註釋經過設置若是沒有指定所使用的單元確保向後兼容性。例如,Spring Boot 1.5 中須要秒數的屬性如今必須@DurationUnit(ChronoUnit.SECONDS)確保一個簡單的值,例如10實際使用的值10s

分隔字符串轉換容許您將簡單綁定StringCollectionArray沒必要分割逗號。例如,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 靈活配置

若是僅提供自定義urluser屬性,則 Flyway 和 Liquibase 的自動配置如今將重用標準數據源屬性,而不是忽略它們。這使您能夠建立一個自定義的數據源,僅用於所需信息的遷移。

Hibernate

如今支持自定義 Hibernate 命名策略。對於高級場景,如今能夠在上下文中定義ImplicitNamingStrategyPhysicalNamingStrategy使用常規 bean。

如今也能夠經過公開HibernatePropertiesCustomizerbean 來更加細緻地定製 Hibernate 使用的屬性。

MongoDB 客戶端自定義

如今能夠經過定義一個類型的 bean 來爲 Spring Boot 自動配置的 Mongo 客戶端應用高級定製MongoClientSettingsBuilderCustomizer

Redis

如今可使用spring.cache.redis.*屬性配置 Redis 的緩存默認值。

Web

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

上下文路徑記錄

當使用嵌入式容器時,當您的應用程序啓動時,上下文路徑將與 HTTP 端口一塊兒記錄。例如,嵌入式 Tomcat 如今看起來像這樣:

1Tomcat 在端口上啓動:8080(http),其上下文路徑爲 '/foo'

Web過濾器初始化

Web 過濾器如今在全部支持的容器上急切地初始化。

Thymeleaf

Thymeleaf 初始化如今包括thymeleaf-extras-java8time,提供javax.time類型支持。

JSON 支持

新的spring-boot-starter-json起始者收集必要的位以讀取和寫入 JSON。它不只提供了jackson-databind與Java8 工做時,也是有用的模塊:jackson-datatype-jdk8jackson-datatype-jsr310jackson-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 的存儲。全部JobDetailCalendarTrigger從你的 Spring應用程序上下文豆將自動註冊Scheduler

有關更多詳細信息,請閱讀參考文檔的新「Quartz Scheduler」部分。

測試

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

  • @WebFluxTest已添加新註釋以支持 WebFlux 應用程序的「切片」測試。

  • ConverterGenericConverter豆類如今自動掃描@WebMvcTest@WebFluxTest

  • @AutoConfigureWebTestClient已經添加了一個註釋來提供一個WebTestClientbean 供測試使用。註釋會自動應用於@WebFluxTest測試。

  • 增長了一個新的ApplicationContextRunner測試實用程序,能夠很容易地測試您的自動配置。咱們已將大部份內部測試套件移至此新模型。詳細信息請參閱更新的文檔。

其它

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

  • @ConditionalOnBean如今在肯定是否知足條件時使用邏輯AND而不是邏輯OR

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

  • springCLI 應用程序如今包括encodepassword可用於建立 Spring Security 的兼容散列密碼命令。

  • 計劃任務(即 @EnableScheduling)可使用scheduledtasks執行器端點進行審查。

  • loggers驅動器終端如今容許你從新設置一個記錄器級別爲它的默認。

  • Spring Session 用戶如今能夠經過sessions執行器端點查找和刪除會話。

  • 使用spring-boot-starter-parent如今基於 Maven 的應用程序-parameters默認使用標誌。

  • 咱們的構建如今使用 concourse 的 CI 和咱們的項目 POM 文件已被重構,使它們更簡單的。

動畫 ASCII 藝術

最後,爲了好玩,Spring Boot 2.0 如今支持動畫 GIF 橫幅。

圖片

參考資料

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release-Notes

關注我

圖片

轉載請務必註明原創地址爲:http://www.54tianzhisheng.cn/2018/03/06/SpringBoot2-new-features/

相關文章
相關標籤/搜索