Spring Boot 2.0詳述
- 2018.2.22
- 版權聲明:本文爲博主chszs的原創文章,未經博主允許不得轉載。
Spring Boot 2.0即將發佈,目前已經發布了v2.0.0 RC2版,據傳說下週可能就會正式發佈。Spring Boot 2.0有一系列重大的改變,下面將一一詳述。
一、Spring Boot 2的基線變化
Java 8基線
Spring Boot 2.0需要Java 8以上版本爲基礎,它不再支持過時的Java 6和Java 7,這可以推動業內開發人員在開發基於Spring Framework的應用時能夠充分利用Java 8/9提供的新特性。
支持Java 9
Spring Boot 2.0完全支持Java 9,並且提供了一個專門的網頁來彙集Spring Boot with Java 9的相關知識和技巧,具體見:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-with-Java-9。
Spring Framework 5.0
Spring Boot 2.0建立在Spring Framework 5.0之上。儘管Spring框架v5.0自2017年9月發佈,但到目前爲止,大多數基於Spring框架的項目都沒有使用它。估計在Spring Boot 2.0GA版發佈後,能快速推動Spring框架v5.0的使用吧。Spring框架v5.0引入了一些很好的改進,其中最值得注意的新特性之一就是它廣泛支持構建響應式應用程序。
二、內嵌的Servlet容器
Spring Boot 2.0可以讓應用程序內嵌Servlet容器,目前主要提供了三種Servlet容器,包括:Jetty、Tomcat、Undertow。其中,Jetty容器是9.4以上版本;Tomcat容器是8.5以上版本。
TLS配置
可以使用server.ssl.*配置屬性爲WebFlux應用程序配置SSL,並且這種配置方式對Tomcat、Jetty、Undertow和Reactor Netty等應用服務器均有效。
支持HTTP/2
Spring Boot 2.0應用程序還可以通過server.http2.enabled設置讓MVC或WebFlux應用程序能夠使用HTTP/2通信協議,並且這種配置方式對Tomcat、Jetty、Undertow應用服務器均有效。具體則依賴於選擇的Web服務器和應用程序環境,因爲HTTP/2協議不受JDK 8開箱即用的支持。
三、構建Build
Maven
Maven項目默認使用-parameters編譯器標誌進行編譯。
Gradle
Spring Boot 2.0需要Gradle 4.x以上版本。Spring Boot的Gradle插件重寫了大量內容,實現了許多重大改進。具體可以閱讀:https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/gradle-plugin/reference
配置Gradle bootRun
BootRun任務提供了用於配置應用程序參數(args)和JVM參數(jvmArgs)的屬性,以及通過execSpec提供了更高級的配置。詳細情況可以閱讀:https://docs.spring.io/spring-boot/docs/2.0.0.M5/gradle-plugin/reference/html/#running-your-application。根據用戶的反饋,這個BootRun任務再次成爲Gradle JavaExec任務的一個子類,它可以像任何其他JavaExec任務一樣進行配置。
四、JDBC/ORM的變化
默認連接池
Spring Boot 2.0默認使用的連接池已從Tomcat的連接池更改爲HikariCP。如果在提供的環境中使用Hikari,tomcat-jdbc包是provided,可以通過spring.datasource.type重寫來移除它。同樣,如果想要保留Tomcat連接池,只需將以下內容添加到應用的配置中即可:
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
數據庫遷移
Liquibase和Flyway配置鍵被轉移到了spring命名空間(即spring.liquibase和spring.flyway)。
Flyway/Liquibase的靈活配置
如果只提供了自定義url或user,auto-configuration會重用標準數據源屬性而不是忽略它們。這使得可以針對遷移數據庫的目的創建自定義的數據源DataSource。
數據源DataSource初始化的檢測
如果你正在使用Flyway或Liquibase管理你的數據源的模式Schema,以及使用的是嵌入式數據庫,Spring Boot 2.0將自動關閉Hibernate的自動DDL功能。
數據庫初始化器
只有在使用嵌入式數據庫時,應用程序的組件中出現了Spring Batch,Spring Integration,Spring Session或Quartz時,數據庫初始化纔會默認發生。其原先的enabled屬性已被具有更多內容的枚舉類型所取代。例如,如果想執行Spring Batch初始化,可以設置:
spring.batch.initialize-schema=always
數據源初始化
數據源DataSource的初始化僅針對嵌入式數據源啓用的情況,並在應用程序使用生產數據庫時立即關閉。此外,新的配置項spring.datasource.initialization-mode(替換原spring.datasource.initialize)提供了更多的控制。
數據源測量
Instrumentation負責監控所有可用的數據源併發布每個指標的度量標準(最小值,最大值和使用率)。
可配置的JPA映射資源
如果將Spring Boot的JPA配置擴展到註冊映射資源,則有一個spring.jpa.mapping-resources屬性。
JdbcTemplate
Spring Boot 2.0的auto-configuration可以通過spring.jdbc.template命名空間自定義JdbcTemplate。此外,NamedParameterJdbcTemplate自動配置的內容會重用JdbcTemplate。
jOOQ
Spring Boot 2.0可以根據數據源DataSource自動檢測jOOQ方言(與JPA方言所做的相似)。此外,@JooqTest註釋還引入了一個簡化測試,但只供jOOQ使用。
Hibernate
Spring Boot 2.0支持的Hibernate的最低版本是5.2版。可以閱讀Hibernate 5.2遷移指南以瞭解如何升級:https://github.com/hibernate/hibernate-orm/wiki/Migration-Guide—5.2
支持自定義Hibernate命名策略
對於高級場景,可以在上下文中定義ImplicitNamingStrategy或PhysicalNamingStrategy用作常規bean。
Hibernate屬性自定義
可以通過暴露HibernatePropertiesCustomizer bean來提供更細粒度的方式自定義Hibernate的屬性。
五、NoSQL
Cassandra
通過spring.data.cassandra暴露池選項。
支持響應式Couchbase
通過Spring Data響應式庫可用於Couchbase,官方提供了一個spring-boot-starter-data-couchbase-reactive輕鬆上手指南。
InfluxDB
如果設置了InfluxDB的Java客戶端和spring.influx.url,那麼InfluxDB客戶端會自動配置,也支持憑證。health終端可以監控InfluxDB服務器。
Redis緩存配置
可以暴露一個RedisCacheConfiguration來控制RedisCacheManager,同時引入了一個新的註釋@DataRedisTest。
Elasticsearch
Spring Boot 2.0需要Elasticsearch 5.4以上版本。與Elastic宣佈的嵌入式Elasticsearch不再受支持保持一致,原型的自動配置NodeClient已被刪除。TransportClient 可以通過使用spring.data.elasticsearch.cluster-nodes提供要連接的一個或多個節點的地址來實現自動配置。
Mongo客戶端自定義
通過定義一個MongoClientSettingsBuilderCustomizer類型的bean,Spring Boot的auto-configures可以將高級自定義應用於MongoDB客戶端。
六、測試
Mockito 1.x
Spring Boot 2.0不再支持Mockito 1.x版的@MockBean和@SpyBean註釋。如果不使用spring-boot-starter-test管理你的依賴,就應該升級到Mockito 2.x版。
TestRestTemplate的Kotlin擴展
Spring Boot 2.0提供了Kotlin的RestTemplate擴展,使開發者的體驗保持一致。
測試改進
可以通過@WebMvcTest和@WebFluxTest註釋自動掃描Converter Bean和GenericConverter Bean。