
背景
在 3 月 1 號(hào),Spring Boot2.0.0.RELEASE正式發(fā)布,這是 Spring Boot1.0 發(fā)布 4 年之后第一次重大修訂,因此有多的新功能和特性值得大家期待!下面帶大家了解下 Spring Boot 2.0 中的新特性。
關(guān)注我

轉(zhuǎn)載請務(wù)必注明原創(chuàng)地址為:http://www.54tianzhisheng.cn/2018/03/06/SpringBoot2-new-features/
從 Spring Boot 1.5 升級(jí)
由于 Spring Boot 2.0 的改變幅度有點(diǎn)大,所以升級(jí)現(xiàn)有的程序可能會(huì)比平常更大一些。
如果你還在考慮是否要升級(jí),這里推薦 DD 的博客文章:Spring Boot 2.0 正式發(fā)布,升還是不升呢?
如果要升級(jí)可以參考我的另外一篇文章:Spring Boot 2.0 遷移指南
如果您目前正在運(yùn)行較早版本的 Spring Boot,我們強(qiáng)烈建議您在遷移到 Spring Boot 2.0 之前先升級(jí)到 Spring Boot 1.5。
新的和值得注意的特性
小技巧:檢查 配置更改日志 來獲取配置更改的完整描述。
起碼 JDK 8 和支持 JDK 9
Spring Boot 2.0 要求 Java 8 作為最低版本。許多現(xiàn)有的 API 已更新,以利用 Java 8 的特性,例如:接口上的默認(rèn)方法,函數(shù)回調(diào)以及新的 API,如javax.time。如果您當(dāng)前正在使用 Java 7 或更早版本,則在開發(fā) Spring Boot 2.0 應(yīng)用程序之前,您需要升級(jí)您的 JDK。
Spring Boot 2.0 通過了在 JDK 9 下的測試,可以在 JDK 9 下正常運(yùn)行,。我們所有的 jar 包都在模塊系統(tǒng)兼容性的清單中附帶了自動(dòng)模塊名稱條目。
第三方庫的升級(jí)
Spring Boot 2.0 建立在 Spring Framework 5 之上,并且需要 Spring Framework 5 。你可以通過 What's New in Spring Framework 5.x 了解 Spring 5 的新特性。并在繼續(xù)之前查看其升級(jí)指南 Upgrading to Spring Framework 5.x 。
我們已盡可能升級(jí)到其他第三方庫的最新穩(wěn)定版本。 本版本中一些顯著的依賴性升級(jí)包括:
- Tomcat 8.5
- Flyway 5
- Hibernate 5.2
- Thymeleaf 3
Reactive Spring
Spring 產(chǎn)品組合中的許多項(xiàng)目現(xiàn)在都為開發(fā)反應(yīng)式應(yīng)用程序提供一流的支持。反應(yīng)性應(yīng)用程序是完全異步和非阻塞的。它們旨在用于事件循環(huán)執(zhí)行模型(而不是更傳統(tǒng)的每個(gè)請求線程執(zhí)行模型)。Spring 框架參考文檔中的“Web 反應(yīng)堆?!?/a>部分為這個(gè)主題提供了一個(gè)很好的入門。
Spring Boot 2.0 通過自動(dòng)配置和啟動(dòng)器 POM 完全支持反應(yīng)式應(yīng)用。Spring Boot 的內(nèi)部本身也在必要時(shí)進(jìn)行了更新,以提供反應(yīng)性的反應(yīng)(最明顯的是我們的嵌入式服務(wù)器支持)。
Spring WebFlux&WebFlux.fn
Spring WebFlux 是 Spring MVC 的完全非阻塞反應(yīng)式替代方案。Spring Boot 為基于注釋的 Spring WebFlux 應(yīng)用程序以及 WebFlux.fn 提供了自動(dòng)配置,WebFlux.fn 提供了更實(shí)用的樣式 API。
要開始,請?zhí)砑?spring-boot-starter-webflux 到 POM,它將提供由嵌入式 Netty 服務(wù)器支持的 Spring WebFlux。
Reactive Spring Data
在底層技術(shù)支持的情況下,Spring Data 還為反應(yīng)式應(yīng)用程序提供支持。目前 Cassandra,MongoDB,Couchbase 和 Redis 都有反應(yīng)式 API 支持。
Spring Boot 包含針對(duì)這些技術(shù)的特殊 starter-POMs,可為您提供啟動(dòng)所需的一切。例如,spring-boot-starter-data-mongodb-reactive包括對(duì)反應(yīng)性 mongo 驅(qū)動(dòng)程序和項(xiàng)目反應(yīng)堆的依賴性。
Reactive Spring Security
Spring Boot 2.0 可以充分利用 Spring Security 5.0 來保護(hù)您的反應(yīng)式應(yīng)用程序。當(dāng) Spring Security 位于類路徑中時(shí),會(huì)為 WebFlux 應(yīng)用程序提供自動(dòng)配置。
使用 WebFlux 的 Spring Security 訪問規(guī)則可以通過SecurityWebFilterChain。如果你之前整合過 Spring MVC 和 Spring Security,應(yīng)該會(huì)感到非常熟悉。有關(guān)更多詳細(xì)信息,請參閱 Spring Boot 參考文檔和 Spring Security 文檔。
嵌入式 Netty 服務(wù)器
由于 WebFlux 不依賴于 Servlet API,我們現(xiàn)在可以首次為 Netty 作為嵌入式服務(wù)器提供支持。該spring-boot-starter-webflux 啟動(dòng) POM 將拉取 Netty 4.1 和 Ractor Netty 。
注意:您只能將 Netty 用作反應(yīng)式服務(wù)器。不提供阻止 servlet API 支持。
HTTP/2 支持
為 Tomcat,Undertow 和 Jetty 提供 HTTP / 2 支持。支持取決于所選的 Web 服務(wù)器和應(yīng)用程序環(huán)境(因?yàn)?JDK 8 不支持該協(xié)議)。
如何配置 HTTP/2,請參考 官方文檔 。
配置屬性的綁定
在 Spring Boot 2.0 中,用于綁定Environment屬性的機(jī)制@ConfigurationProperties已經(jīng)完全徹底修改。我們借此機(jī)會(huì)收緊了松散綁定的規(guī)則,并修復(fù)了 Spring Boot 1.x 中的許多不一致之處。
新的BinderAPI 也可以@ConfigurationProperties直接在你自己的代碼之外使用。例如,下面將結(jié)合到List的PersonName對(duì)象:
List<PersonName> people = Binder.get(environment)
.bind("my.property", Bindable.listOf(PersonName.class))
.orElseThrow(IllegalStateException::new);
配置源可以像這樣在 YAML 中表示:
my:
property:
- first-name: zhisheng
last-name: tian
- first-name: zhisheng
last-name: tian
有關(guān)更新綁定規(guī)則的更多信息,請參閱此Wiki頁面。
配置起源
YAML 文件和被 Spring Boot 加載的 Properties 文件現(xiàn)在包含Origin信息,可幫助您跟蹤項(xiàng)目從何處加載的信息。有些 Spring Boot 特性利用了這個(gè)信息可以在適當(dāng)?shù)臅r(shí)候展示出來。
例如,BindException綁定失敗時(shí)拋出的類是一個(gè)OriginProvider。這意味著原始信息可以很好地從故障分析器中顯示出來。
另一個(gè)例子是env執(zhí)行器端點(diǎn),當(dāng)它有可用時(shí)包含了原始信息。下面的代碼片斷顯示該spring.security.user.name屬性來自 jar 包中的 application.properties 文件的第 1行,第 27 列。
{
"name": "applicationConfig: [classpath:/application.properties]",
"properties": {
"spring.security.user.name": {
"value": "user",
"origin": "class path resource [application.properties]:1:27"
}
}
}
轉(zhuǎn)換器支持
Binding 利用了一個(gè)新的 ApplicationConversionService 類,它提供了一些對(duì)屬性綁定特別有用的額外轉(zhuǎn)換器。最引人注目的是轉(zhuǎn)換器的Duration類型和分隔字符串。
該Duration轉(zhuǎn)換器允許在任一 ISO-8601 格式中指定的持續(xù)時(shí)間,或作為一個(gè)簡單的字符串(例如10m,10 分鐘)?,F(xiàn)有的屬性已更改為始終使用Duration。該@DurationUnit注釋通過設(shè)置如果沒有指定所使用的單元確保向后兼容性。例如,Spring Boot 1.5 中需要秒數(shù)的屬性現(xiàn)在必須@DurationUnit(ChronoUnit.SECONDS)確保一個(gè)簡單的值,例如10實(shí)際使用的值10s。
分隔字符串轉(zhuǎn)換允許您將簡單綁定String到Collection或Array不必分割逗號(hào)。例如,LDAP base-dn 屬性用 @Delimiter(Delimiter.NONE),所以 LDAP DN(通常包含逗號(hào))不會(huì)被錯(cuò)誤解釋。
Gradle 插件
Spring Boot 的 Gradle 插件已在很大程度上進(jìn)行了重新編寫,以實(shí)現(xiàn)許多重大改進(jìn)。您可以在其參考文獻(xiàn)和 API 文檔中閱讀關(guān)于插件功能的更多信息。
Spring Boot 現(xiàn)在需要 Gradle 4.x. 如果您要升級(jí)使用 Gradle 的項(xiàng)目,請查看遷移指南。
Kotlin
Spring Boot 2.0 現(xiàn)在包含對(duì) Kotlin 1.2.x 的支持,并提供了runApplication ,一個(gè)使用 Kotlin 運(yùn)行 Spring Boot 應(yīng)用程序的方法。我們還公開和利用了 Kotlin 對(duì)其他 Spring 項(xiàng)目(如Spring Framework,Spring Data 和 Reactor)已添加到其最近版本中的支持。
有關(guān)更多信息,請參閱參考文檔的Kotlin支持部分。
Actuator 改進(jìn)
在 Spring Boot 2.0 中 Actuator endpoints 有很大的改進(jìn)。所有 HTTP Actuator endpoints 現(xiàn)在都在該/actuator路徑下公開,并且生成的 JSON 有效負(fù)載得到了改進(jìn)。
我們現(xiàn)在也不會(huì)在默認(rèn)情況下暴露很多端點(diǎn)。如果您要升級(jí)現(xiàn)有的 Spring Boot 1.5 應(yīng)用程序,請務(wù)必查看遷移指南并特別注意該management.endpoints.web.exposure.include屬性。
Actuator JSON
Spring Boot 2.0 改進(jìn)了從許多端點(diǎn)返回的 JSON 有效負(fù)載。
現(xiàn)在許多端點(diǎn)都具有更精確地反映底層數(shù)據(jù)的 JSON。例如,/actuator/conditions終端(/autoconfig在Spring Boot 1.5中)現(xiàn)在有一個(gè)頂級(jí)contexts密鑰來將結(jié)果分組ApplicationContext。
現(xiàn)在還使用 Spring REST Docs 生成了廣泛的 REST API 文檔,并隨每個(gè)版本發(fā)布。
Jersey and WebFlux 支持
除了支持 Spring MVC 和 JMX,您現(xiàn)在可以在開發(fā) Jersey 或 WebFlux 應(yīng)用程序時(shí)訪問執(zhí)行器端點(diǎn)。Jersey 支持通過自定義 Jersey 提供Resource,WebFlux 使用自定義HandlerMapping。
Hypermedia links
該/actuator端點(diǎn)現(xiàn)在提供了一個(gè) HAL 格式的響應(yīng)提供鏈接到所有活動(dòng)端點(diǎn)(即使你沒有 Spring HATEOAS 在classpath)。
Actuator @Endpoints
為了支持 Spring MVC,JMX,WebFlux 和 Jersey,我們?yōu)?Actuator @Endpoints 開發(fā)了一種新的編程模型。該@Endpoint注解可以與@ReadOperation,@WriteOperation 和 @DeleteOperation 組合使用開發(fā) endpoints。
您還可以使用@EndpointWebExtension或@EndpointJmxExtension編寫技術(shù)特定的增強(qiáng)功能到 endpoints。詳細(xì)信息請參閱更新的參考文檔。
Micrometer
Spring Boot 2.0 不再提供自己的指標(biāo) API。相反,我們依靠 micrometer.io 來滿足所有應(yīng)用程序監(jiān)視需求。
Micrometer 包括尺寸指標(biāo)的支持,當(dāng)與尺寸監(jiān)測系統(tǒng)配對(duì)時(shí),尺寸指標(biāo)可以有效訪問特定的指定度量標(biāo)準(zhǔn),并且可以在其尺寸范圍內(nèi)向下鉆取。
指標(biāo)可以輸出到各種系統(tǒng)和開箱即用的 Spring Boot 2.0,為 Atlas,Datadog,Ganglia,Graphite,Influx,JMX,New Relic,Prometheus,SignalFx,StatsD 和 Wavefront 提供支持。另外還可以使用簡單的內(nèi)存中度量標(biāo)準(zhǔn)。
集成隨 JVM 指標(biāo)(包括 CPU,內(nèi)存,線程和 GC),Logback,Tomcat,Spring MVC&提供RestTemplate。
有關(guān)更多詳細(xì)信息,請參閱參考文檔的更新“指標(biāo)”部分。
數(shù)據(jù)支持
除了上面提到的 Reactive Spring Data 支持外,在數(shù)據(jù)領(lǐng)域還進(jìn)行了其他一些更新和改進(jìn)。
HikariCP
Spring Boot 2.0 中的默認(rèn)數(shù)據(jù)庫池技術(shù)已從 Tomcat Pool 切換到 HikariCP。我們發(fā)現(xiàn) Hakari 提供了卓越的性能,我們的許多用戶更喜歡 Tomcat Pool。
初始化
數(shù)據(jù)庫初始化邏輯在 Spring Boot 2.0 中已經(jīng)合理化。Spring Batch,Spring Integration,Spring Session 和 Quartz的初始化現(xiàn)在僅在使用嵌入式數(shù)據(jù)庫時(shí)才會(huì)默認(rèn)發(fā)生。該enabled屬性已被替換為更具表現(xiàn)力枚舉。例如,如果你想一直執(zhí)行 Spring Batch 的初始化,您可以設(shè)置spring.batch.initialize-schema=always。
如果 Flyway 或 Liquibase 正在管理您的 DataSource 的模式,并且您正在使用嵌入式數(shù)據(jù)庫,Spring Boot 現(xiàn)在會(huì)自動(dòng)關(guān)閉 Hibernate 的自動(dòng) DDL 功能。
JOOQ
Spring Boot 2.0 現(xiàn)在基于 DataSource 自動(dòng)檢測 JOOQ 方言(類似于為 JPA 方言所做的)。@JooqTest是新引入的注解用來簡化那些只有 JOOQ 必須被使用的測試。
JdbcTemplate
Spring Boot 自動(dòng)配置的 JdbcTemplate 現(xiàn)在可以通過 spring.jdbc.template 屬性進(jìn)行自定義。此外,NamedParameterJdbcTemplate自動(dòng)配置的內(nèi)容會(huì)重用JdbcTemplate。
Spring Data Web 配置
Spring Boot 公開了一個(gè)新的spring.data.web配置名稱空間,可以輕松配置分頁和排序。
InfluxDB
Spring Boot 現(xiàn)在自動(dòng)配置開源時(shí)間序列數(shù)據(jù)庫 InfluxDB。要啟用 InfluxDB 支持,您需要設(shè)置一個(gè)spring.influx.url屬性,并將其包含influxdb-java在您的類路徑中。
Flyway/Liquibase 靈活配置
如果僅提供自定義url或user屬性,則 Flyway 和 Liquibase 的自動(dòng)配置現(xiàn)在將重用標(biāo)準(zhǔn)數(shù)據(jù)源屬性,而不是忽略它們。這使您可以創(chuàng)建一個(gè)自定義的數(shù)據(jù)源,僅用于所需信息的遷移。
Hibernate
現(xiàn)在支持自定義 Hibernate 命名策略。對(duì)于高級(jí)場景,現(xiàn)在可以在上下文中定義ImplicitNamingStrategy或PhysicalNamingStrategy使用常規(guī) bean。
現(xiàn)在也可以通過公開HibernatePropertiesCustomizerbean 來更加細(xì)致地定制 Hibernate 使用的屬性。
MongoDB 客戶端自定義
現(xiàn)在可以通過定義一個(gè)類型的 bean 來為 Spring Boot 自動(dòng)配置的 Mongo 客戶端應(yīng)用高級(jí)定制MongoClientSettingsBuilderCustomizer。
Redis
現(xiàn)在可以使用spring.cache.redis.*屬性配置 Redis 的緩存默認(rèn)值。
Web
除了上面提到的 WebFlux 和 WebFlux.fn 支持之外,還在開發(fā) Web 應(yīng)用程序時(shí)進(jìn)行了以下改進(jìn)。
上下文路徑記錄
當(dāng)使用嵌入式容器時(shí),當(dāng)您的應(yīng)用程序啟動(dòng)時(shí),上下文路徑將與 HTTP 端口一起記錄。例如,嵌入式 Tomcat 現(xiàn)在看起來像這樣:
Tomcat 在端口上啟動(dòng):8080(http),其上下文路徑為 '/foo'
Web過濾器初始化
Web 過濾器現(xiàn)在在所有支持的容器上急切地初始化。
Thymeleaf
Thymeleaf 初始化現(xiàn)在包括thymeleaf-extras-java8time,提供javax.time類型支持。
JSON 支持
新的spring-boot-starter-json起始者收集必要的位以讀取和寫入 JSON。它不僅提供了jackson-databind與Java8 工作時(shí),也是有用的模塊:jackson-datatype-jdk8,jackson-datatype-jsr310和jackson-module-parameter-names。這個(gè)新的起動(dòng)器現(xiàn)在被用于jackson-databind之前定義的地方。
如果您更喜歡 Jackson 之外的其他產(chǎn)品,我們對(duì) GSON 的支持在 Spring Boot 2.0 已經(jīng)大大提高。我們還引入了對(duì) JSON-B 的支持(包括 JSON-B 測試支持)。
Quartz
自動(dòng)配置支持目前包含了 Quartz Scheduler。我們還添加了新的spring-boot-starter-quartz 初始化 POM。
您可以使用內(nèi)存JobStores中或完整的基于 JDBC 的存儲(chǔ)。所有JobDetail,Calendar并Trigger從你的 Spring應(yīng)用程序上下文豆將自動(dòng)注冊Scheduler。
有關(guān)更多詳細(xì)信息,請閱讀參考文檔的新“Quartz Scheduler”部分。
測試
對(duì) Spring Boot 2.0 中提供的測試支持進(jìn)行了一些補(bǔ)充和調(diào)整:
-
@WebFluxTest已添加新注釋以支持 WebFlux 應(yīng)用程序的“切片”測試。 -
Converter和GenericConverter豆類現(xiàn)在自動(dòng)掃描@WebMvcTest和@WebFluxTest。 -
@AutoConfigureWebTestClient已經(jīng)添加了一個(gè)注釋來提供一個(gè)WebTestClientbean 供測試使用。注釋會(huì)自動(dòng)應(yīng)用于@WebFluxTest測試。 - 增加了一個(gè)新的
ApplicationContextRunner測試實(shí)用程序,可以很容易地測試您的自動(dòng)配置。我們已將大部分內(nèi)部測試套件移至此新模型。詳細(xì)信息請參閱更新的文檔。
其它
除了上面列出的變化外,還有很多小的調(diào)整和改進(jìn),包括:
-
@ConditionalOnBean現(xiàn)在在確定是否滿足條件時(shí)使用邏輯AND而不是邏輯OR。 - 無條件類現(xiàn)在包含在自動(dòng)配置報(bào)告中。
- 該
springCLI 應(yīng)用程序現(xiàn)在包括encodepassword可用于創(chuàng)建 Spring Security 的兼容散列密碼命令。 - 計(jì)劃任務(wù)(即
@EnableScheduling)可以使用scheduledtasks執(zhí)行器端點(diǎn)進(jìn)行審查。 - 該
loggers驅(qū)動(dòng)器終端現(xiàn)在允許你重新設(shè)置一個(gè)記錄器級(jí)別為它的默認(rèn)。 - Spring Session 用戶現(xiàn)在可以通過
sessions執(zhí)行器端點(diǎn)查找和刪除會(huì)話。 - 使用
spring-boot-starter-parent現(xiàn)在基于 Maven 的應(yīng)用程序-parameters默認(rèn)使用標(biāo)志。 - 我們的構(gòu)建現(xiàn)在使用 concourse 的 CI 和我們的項(xiàng)目 POM 文件已被重構(gòu),使它們更簡單的。
動(dòng)畫 ASCII 藝術(shù)
最后,為了好玩,Spring Boot 2.0 現(xiàn)在支持動(dòng)畫 GIF 橫幅。

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

相關(guān)文章
1、Spring Boot 2.0系列文章(一):Spring Boot 2.0 遷移指南
2、Spring Boot 2.0系列文章(二):Spring Boot 2.0 新特性詳解
3、Spring Boot 2.0系列文章(三):Spring Boot 2.0 配置改變
4、Spring Boot 2.0系列文章(四):Spring Boot 2.0 源碼閱讀環(huán)境搭建
5、Spring Boot 2.0系列文章(五):Spring Boot 2.0 項(xiàng)目源碼結(jié)構(gòu)預(yù)覽
6、Spring Boot 2.0系列文章(六):Spring boot 2.0 中 SpringBootApplication 注解詳解