1. 程式人生 > >Spring Boot 2.0 新特性和發展方向

Spring Boot 2.0 新特性和發展方向

徹底 文章 leaf 排序 cor 自動掃描 由於 let reactive

以Java 8 為基準

Spring Boot 2.0 要求Java 版本必須8以上, Java 6 和 7 不再支持。

內嵌容器包結構調整

為了支持reactive使用場景,內嵌的容器包結構被重構了的幅度有點大。EmbeddedServletContainer被重命名為WebServer,並且org.springframework.boot.context.embedded 包被重定向到了org.springframework.boot.web.embedded包下。舉個例子,如果你要使用TomcatEmbeddedServletContainerFactory回調接口來自定義內嵌Tomcat容器,你現在應該使用TomcatServletWebServerFactory。

Servlet-specific 的server properties調整

大量的Servlet專屬的server.* properties被移到了server.servlet下:

Old property New property
server.context-parameters.* server.servlet.context-parameters.*
server.context-path server.servlet.context-path
server.jsp.class-name server.servlet.jsp.class-name
server.jsp.init-parameters.*
server.servlet.jsp.init-parameters.*
server.jsp.registered server.servlet.jsp.registered
server.servlet-path server.servlet.path

由此可以看出一些端倪,那就是server不再是只有servlet了,還有其他的要加入。

Actuator 默認映射

Actuator的端點(endpoint)現在默認映射到/application,比如,/info 端點現在就是在/application/info。但你可以使用management.context-path來覆蓋此默認值。

@ConditionalOnBean

@ConditionalOnBean現在的判斷條件由OR變為了AND。

Remote CRaSH shell

1.5的時候此遠程工具被標為deprecated,2.0的時候將會把這個支持徹底remove掉,以及基於此功能的項目也會被刪除掉。

Spring Loaded不再支持

由於Spring Loaded項目已被移到了attic了,所以不再支持Spring Loaded了。現在建議你去使用Devtools。Spring Loaded不再支持了。

Hazelcast自動配置不再支持

不能再自動配置HazelcastInstance進行緩存。 因此,spring.cache.hazelcast.config屬性不再可用。

默認connection pool變了

默認的連接池已經由Tomcat切換到了HikariCP。如果你過去使用spring.datasource.type在基於Tomcat的應用程序中強制使用Hikari,現在你可以刪除這個覆蓋了。同樣的,如果想要使用Tomcat的連接池,只需要簡單的加入以下配置就可以了:

spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource

Servlet Filters

針對一個Filter默認的dispatcher類型現在為 DipatcherType.REQUEST,這樣就保證了Spring Boot和Servlet默認的配置統一了。

Spring Security

Spring Security的 filter 現在可以自動配置如下類型了: ASYNC, ERROR, and REQUEST 。這樣就讓Spring Boot中的配置和Spring Security默認配置保持一致了。

Spring Session

Spring Session的 filter 現在支持自動配置如下dispatcher類型 ASYNC, ERROR, and REQUEST 。同樣是為了讓Spring Boot的配置與Spring Session的默認配置保持一致。值得註意的是從Spring Session 2.0起, Mongo和GemFire 將不再被支持。

Jetty

要求Jetty最低版本為9.4。

Tomcat

要求Tomcat最低版本為8.5。

Hibernate

要求Hibernate最低版本為5.2。

Gradle

要求Gradle最低版本為3.4。

SendGrid

SendGrid最低支持版本是3.2。為了支持這次升級,username和password已經被幹掉了。因為API key現在是唯一支持的認證方式。

Starter 的傳遞依賴的改變

以前有幾個Spring Boot starter是依靠Spring MVC和spring-boot-starter-web傳遞的。 為了對Spring WebFlux的支持,spring-boot-starter-mustache和spring-boot-starter-thymeleaf不再依賴spring-boot-starter-web。現在你要自己選擇並添加spring-boot-starter-web或spring-boot-starter-webflux作為依賴。

記住:web和webflux是平行的關系。我們之前的文章中提到過spring webflux。你可以移步查看:Spring 5 新增全新的reactive web框架:webflux。

Solr健康指標

針對Solr的健康檢查信息不再是solrStatus這個屬性了。現在是status property,是一個標準狀態屬性,對應於一個的整型值。

默認代理策略

Spring Boot現在默認是使用CGLIB代理,同時包含AOP支持。如果你需要基於代理(proxy-based)的代理策略,你需要把spring.aop.proxy-target-class設置為false。

基於CLI的測試

從Spring Boot的CLI中刪除了測試支持,現在建議你使用Maven或Gradle構建應用程序,去使用它們提供的豐富的測試支持吧。

@ConfigurationProperties

@ConfigurationProperties裏的ignoreNestedProperties屬性已被刪除。

Multipart配置改變

為了更好的反映Servlet的特性, spring.http.multipart. 屬性已經被命名為 spring.servlet.multipart。

ps:其實就是因為webflux來了,只能把servlet和webflux區分開來。

Mustache 模板默認文件擴展名

過去Mustache模板的默認的文件擴展名是.html。現在.mustache成了官方指定的擴展名,而且很多的IDE插件已經支持了此後綴。你可以通過spring.mustache.suffix來覆蓋現在的默認的支持。

Spring Framework 5.0

Spring Boot 2.0 是建立在Spring Framework 5.0之上的(最低要求)。Spring 5最大的亮點就是reactive。你可以去看看這篇:Spring 5 新增全新的reactive web框架:webflux。

松綁定改善

松綁定已經得到改善。這裏簡單的舉個例子:

簡單的屬性在刪除特殊字符然後轉成小寫後進行綁定。比如:

下面的屬性最終都會被映射為spring.jpa.databaseplatform=mysql:

spring.jpa.database-platform=mysql

spring.jpa.databasePlatform=mysql

spring.JPA.database_platform=mysql

有關詳細信息,我們可以查閱:https://github.com/spring-projects/spring-boot/wiki/Relaxed-Binding-2.0

WebFlux 和 WebFlux.fn支持

Spring Boot 2.0 提供了一個新的starter ,用來支持Reactive Spring web frameworks。該starter為spring-boot-starter-webflux。其中Reactor Netty是默認的web引擎(spring-boot-starter-reactor-netty)。

Reactive數據庫支持

Spring Boot 2.0 對一下的數據庫提供了自動配置( auto-configuration )的reactive的支持:

  • MongoDB (spring-boot-starter-data-mongodb-reactive)
  • Redis (spring-boot-starter-data-redis-reactive)
  • Cassandra (spring-boot-starter-data-cassandra-reactive)

@DataMongoTest測試註解也是支持reactive的。

@WebFluxTest支持


Reactive controller現在可以使用@WebFluxTest來測試。它提供的功能和 @WebMvcTest類似。而且WebTestClient可以直接使用,已經被自動配置(auto-configured)了。

支持使用@SpringBootTest自動配置WebTestClient


當你使用@SpringBootTest with an actual server (that is, either DEFINED_PORT or RANDOM_PORT), a WebTestClient is available the same way TestRestTemplate is.

使用@SpringBootTest進行WebTestClient自動配置

將@SpringBootTest用於實際服務器(即DEFINED_PORT或RANDOM_PORT)時,WebTestClient的可用方式與TestRestTemplate相同。

Gradle插件


Spring Boot的Gradle插件已在很大程度上被重寫,以實現一些重大的改進。有關這方面的就不細講了,感興趣的同學可以去一探究竟。

/loggers端點POST的狀態碼改變

針對/loggers端點上POST操作的狀態碼已又200改為204。

Elasticsearch

Elasticsearch已升級到5.4。 與Elastic公司宣布不再支持嵌入式Elasticsearch的情況一樣,NodeClient的自動配置已被刪除。就是這麽的節奏一致。現在你可以通過使用spring.data.elasticsearch.cluster-nodes自動配置TransportClient,具體value可以是一個或多個要連接的節點的地址。

Quartz Scheduler


Spring Boot 2 針對Quartz調度器提供了支持。你可以加入spring-boot-starter-quartz starter來啟用。而且支持基於內存和基於jdbc兩種存儲。

Spring Data Web配置

Spring Boot公開了一個新的spring.data.web配置名稱空間,可以輕松配置分頁和排序。

Json starter

一個全新的spring-boot-starter-json starter 聚合了很多常用的json工具,可以支持對json的讀寫。

它不僅僅提供了jackson-databind而且當你使用java8時候,還提供了有用的模塊:jackson-datatype-jdk8, jackson-datatype-jsr310 和 jackson-module-parameter-names。

之前使用jackson-databind的地方就可以使用這個新的starter了。

Thymeleaf starter

Thymeleaf starter現在包含了thymeleaf-extras-java8time,開箱即用。

InfluxDB

如果InfluxDB java client 和 the spring.influx.url 被設置, 一個InfluxDB client現在就會被自動配置。而且現在支持認證。

JdbcTemplate

Spring Boot自動配置(auto-configuration)的JdbcTemplate現在可以通過spring.jdbc.template命名空間進行定制。 此外,自動配置(auto-configuration)的NamedParameterJdbcTemplate在底層就是JdbcTemplate。

jOOQ

Spring Boot現在可以根據DataSource自動檢測出jOOQ方言(類似於JPA方言)。

此外,還引入了@JooqTest用於只有jOOQ才能hold的測試場景。

@DataRedisTest

新加了一個測試的時候針對redis的新註解。

強大的Mongo客戶端自定義

現在可以通過MongoClientSettingsBuilderCustomizer這個bean來高度定制化Spring Boot的Mongo客戶端。

Cassandra

spring.data.cassandra 現在支持池化(pooling)。

Kafka listener支持批量消費

現在支持一次性批量消費多個ConsumerRecord,你可以創建一批的監聽器(listener),這樣設置:

spring.kafka.listener.type=batch

Web filters 初始化

Web filters 現在在所有支持的容器中都會被立刻初始化。也就是eagerly,急加載。

Auto-configuration 報告

現在不滿足條件(unconditional)的class也會被包含進來,在自動配置(auto-configuration)的Actuator端點的response中一並返回。

重置logger操作

現在Loggers端點(endpoint) 支持reset日誌級別到默認設置。

Maven 插件屬性

插件的配置屬性現在的暴露方式有所改變,現在所有的都是以spring-boot為前綴,這是為了避免和其他插件沖突而導致錯誤。

比如,以下命令行可以啟用profile foo:

mvn spring-boot:run -Dspring-boot.run.profiles=foo

Devtools 遠程調試

已經從Devtools中刪除了通過HTTP進行遠程調試的支持。(#9489)

Jetty

為了和Tomcat和Undertow看齊,現在對Jetty的所有的http method的請去都進行壓縮,而不是之前那樣只對GET request進行壓縮(#8184)。

Reactive server 自定義

當配置一個reactive web server時,針對Jetty,Tomcat,Undertow的定制化器現在會被調用 (#9572)。

Jolokia

Jolokia不再是一個endpoint。並且默認是禁用的,這已和其他的web端點保持了一直。它的配置已轉移到了management.jolokia。如果想啟用 Jolokia, 向你的配置加入management.jolokia.enabled=true就可以了。

數據庫遷移

Liquibase 和 Flyway 配置的key 已被轉移到了spring 的命名空間下:(比如: spring.liquibase and spring.flyway )。

Auto-configuration排序

@AutoConfigureOrder 默認值由Ordered.LOWEST_PRECEDENCE變為0。 (#10142)

Auto-configuration測試工具

一個新的ApplicationContextRunner 測試工具讓我們測試自動配置變得容易。 未來將會把所有的測試套件都遷移到這個模型上。

Java 9 支持

基本支持了Java 9。之所以是“基本”,是因為還沒得到用戶的驗證。

Jedis變為了Lettuce

Redis客戶端驅動現在由Jedis變為了Lettuce。使用Jedis的同學們,大概知道方向了吧。

但仍然支持Jedis,那麽exclude掉io.lettuce:lettuce-core,然後添加 redis.clients:jedis就是了。

OAuth 2.0 支持

Spring Security OAuth 項目中的功能將會遷移到Spring Security中。將會OAuth 2.0。

Mockito 1.x

Mockito 1.x不再支持@MockBean和@SpyBean。 如果你不使用spring-boot-starter-test來管理依賴關系,則應升級到Mockito 2.x。

JSON-B 支持


除了Jackson 和 Gson,現在還支持了JSON-B 。JSON測試支持也已更新為新的JsonbTester類。

Session Endpoint

Spring Session 用現在可以通過/application/sessions Actuator Endpoint進行查找和刪除session。

ConfigurationProperties 驗證

如果你希望@ConfigurationProperties對象上開啟驗證,那麽只需要添加@Validated就可以了。

Spring Mobile

針對Spring Mobile的自動配置和依賴不再支持,已被刪除。汗,我們之前的文章中還介紹過這個項目:使用Spring Boot開發一個Spring Mobile程序。

Spring WebFlux支持錯誤約定

Spring Boot現在讓WebFlux的錯誤約定和MVC保持一致就像使用MVC一樣:默認視圖和JSON響應錯誤,自定義錯誤視圖等等。

TLS 配置 和 HTTP/2 支持

你現在可以為你的WebFlux應用配置SSL,使用server.ssl.*配置屬性。Tomcat, Jetty, Undertow 和 Reactor Netty都支持。

你現在也可以為你的MVC 或 WebFlux應用配置HTTP/2:

使用server.http2.enabled

@KafkaListener支持使用@SendTo

使用了自動配置工廠的Kafka listener現在支持@SendTo

Kotlin擴展

Spring Boot 2.0 發布了Kotlin runApplication擴展:

  1. package com.example.demo
  2. import org.springframework.boot.autoconfigure.SpringBootApplication
  3. import org.springframework.boot.runApplication
  4. @SpringBootApplication
  5. class DemoApplication
  6. fun main(args: Array<String>) {
  7. runApplication<DemoApplication>(*args)
  8. }

Job command line runner 順序

CommandLineRunner 現在執行批處理job的啟動order是0。

支持自動配置的模板化歡迎頁

Spring Boot 2.0 現在支持靜態和模板化兩種歡迎頁類型。它會首先去配置好的靜態內容的目錄下查找index.html文件,如果沒找到,然後就去查找index模板。 只要找到了一個就會被用作歡迎頁。

Context path會在啟動時被打印

在Spring Boot之前的版本中,對context path貌似並沒有那麽的重視一樣。現在當我們使用內嵌容器的時候, context path 會被打印在HTTP 端口的旁邊,像這樣:

Tomcat started on port(s): 8080 (http) with context path ‘/foo’

測試優化,自動掃描Converter和GenericConverter

Converter 和 GenericConverter beans現在可以被@WebMvcTest和@WebFluxTest自動掃描到了。

Health vs. Status

status endpoint 已經被刪除了,現在改成了health。這個health 端點既可以展示status也可以有更多的細節。 health 端點現在默認是被暴露的(只展示status)。如果你希望展示更多的細節信息,可以通過修改屬性management.endpoints.health.show-details來實現:

management.endpoints.health.show-details=true

原文鏈接:

https://mp.weixin.qq.com/s/EWmuzsgHueHcSB0WH-3AQw

Spring Boot 2.0 新特性和發展方向