Spring Boot 2.4.0 正式版本不再添加 RELEASE 后綴聲明,在這個版本中增加了大量的新特性和改進,切記,不要輕易升級
除了剛發布的Spring Boot 2.4.0,Spring Boot 2.3.x/2.2.x仍舊是活躍的維護的版本。Spring Boot遵循的是Pivotal OSS支持策略,從發布日期起支持主要版本3年(注意:是主要版本)。下面是詳情:
- 2.3.x:支持的版本。2020.05發布,是現在的活躍的主干
- 2.2.x:支持的版本。2019.10發布,是現在的活躍的主干
- 2.1.x:2018.10發布,支持到2020.10月底,建議盡快升級
- 2.0.x:2018.3發布,2019.4.3停止維護
- 1.5.x:生命已終止的版本。2017.1發布,是最后一個1.x分支,2019.8.1停止維護
2.4.0主要新特性
版本命名的更改
從2.4.0開始,版本名將去除RELEASE后綴,所以這次的版本不是2.4.0.RELEASE,而是2.4.0
2.4.0是第一個使用新版本方案的Spring Boot發行版本
全新的配置文件處理(properties/yaml)
這個改變最為重磅,本次改變了配置文件的加載邏輯,旨在簡化和合理化外部配置的加載方式,它可能具有不向下兼容性。
Spring Boot 2.4改變了處理application.properties和application.yml文件的方式:
- 若你只是簡單的文件application.properties/yaml,那么升級對你是無縫的,你感受不到任何變化
- 若你使用了比較復雜的文件,如application-profile.properties/yaml這種(或者使用了Spirng Cloud的配置中心、(帶有分隔符----的)多yaml文件),那么默認是不向下兼容的,需要你顯式的做出些更改
因為配置文件隸屬於程序的一部分,特別是我們現在幾乎都會使用到配置中心。因此下面針對於老版本升級到Spring Boot 2.4.0做個簡單的遷移指導。
Spring Boot 2.4對application.poperties/yaml的處理做了更新/升級。旨在簡化和合理化外部配置的加載方式。它還提供了新功能:spring.config.import支持。所以呢,對於Spring Boot 2.4.0之前的版本(老版本)若升級到2.4.0需要做些修改,指導建議如下:
增加此配置后,Spring Boot對配置文件的解析恢復到原來模式:仍舊使用ConfigFileApplicationListener去解析
此API在2.4.0已被標記為過期,按照Spring Boot的版本策略,此類將在Spring Boot 2.6.0版本被移除。因此:若不是迫不得已(時間緊急),並不建議你用兼容手法這么去做,因為這將成為技術債,遲早要還的。
方式一:恢復舊模式(不推薦)
如果你還未准備好做配置遷移的修改,Spring Boot也幫你考慮到了,提供了一鍵切換到舊模式的“按鈕”。具體做法是:只需要在Environment里增加一個屬性spring.config.use-legacy-processing = true就搞定。最簡的方式就是把這個屬性放在application.poperties/yaml里即可。
方式二:按新規則遷移(推薦)
若你對配置文件的使用有如下情行,那么你需要做遷移:
- 多文檔的yaml文件(帶有----分隔符的文件)
- 在Jar外使用配置文件,或者使用形如application-{xxx}.properties/yaml這種配置
- 若在多文檔yaml中使用到了spring.profiles配置項
- ...
Spring Boot 2.4.0升級對配置文件的改動是最大的,並且還不具備向下兼容性,簡單的說就是從此版本開始要把Spring Boot的配置文件加載機制重學一遍(比如還增加了spring.config.import,增加了對kubernetes配置的支持等等),並且還要學會如何遷移。
新的 spring.config.import 屬性可用於導入 Kubernetes 中常用的配置樹
添加了一個新的啟動端點,用來顯示應用啟動有關的詳細信息,比如可以幫助我們來診斷啟動時間比預期更長的 Spring Beans
Docker 支持升級
完美支持Java 15
核心依賴升級
-
Spring AMQP 2.3
-
Spring Batch 4.3
-
Spring Data 2020.0
-
Spring Framework 5.3
-
Spring Integration 5.4
-
Spring HATEOAS 1.2
-
Spring Kafka 2.6
-
Spring Retry 1.3
-
Spring Security 5.4
-
Spring Session 2020.0
嵌入式數據庫檢測
改進嵌入式數據庫檢測機制:僅當數據庫在內存中時才將其視為嵌入式數據庫。所以如果使用H2、HSQL等產品,但是你是基於文件的持久性或使用的是服務器模式,那么將不會檢測為內存數據庫。而對於非內存數據庫,你可能需要額外做如下動作:
- sa用戶名將不會再被主動設置。所以如果你的數據庫需要用戶名,請增加配置項:spring.datasource.username = sa
- 這種數據庫將不會再被自動初始化,若要使用請根據需要更改spring.datasource.initialization-mode的值
Logback配置屬性的更改
Logback一些配置項改名了,新增了配置類LogbackLoggingSystemProperties用於對應,它繼承自之前的LoggingSystemProperties
之前的配置項有些被廢棄(此版本還未刪除,后續版本肯定會刪除的),對應關系如下
老(~ |
新 |
---|---|
logging.pattern.rolling-file-name | logging.logback.rollingpolicy.file-name-pattern |
logging.file.clean-history-on-start | logging.logback.rollingpolicy.clean-history-on-start |
logging.file.max-size | logging.logback.rollingpolicy.max-file-size |
logging.file.total-size-cap | logging.logback.rollingpolicy.total-size-cap |
logging.file.max-history | logging.logback.rollingpolicy.max-history |
一些屬性是被放到system environment里面的:
老(~ |
新 |
---|---|
ROLLING_FILE_NAME_PATTERN | LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN |
LOG_FILE_CLEAN_HISTORY_ON_START | LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START |
LOG_FILE_MAX_SIZE | LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE |
LOG_FILE_TOTAL_SIZE_CAP | LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP |
LOG_FILE_MAX_HISTORY | LOGBACK_ROLLINGPOLICY_MAX_HISTORY |
不再注冊DefaultServlet
從Spring Boot 2.4開始,默認將不會再注冊DefaultServlet。因為在絕大多數的應用中,Spring MVC提供的DispatcherServlet是唯一需要被注冊的Servlet。
若你的工程強依賴於此Servelt,那么可以通過此配置項server.servlet.register-default-servlet = true把它注冊上去。
HTTP traces不再包含cookie頭
默認情況下,不在 HTTP traces中包含 Cookie 請求頭和 set-Cookie 響應頭。
若你仍舊想保留老的習慣,那么請用配置項management.trace.http.include = cookies, errors, request-headers, response-headers自行控制。
從spring-boot-starter-test中刪除Vintage Engine
Spring Boot 2.2.0版本開始就引入JUnit 5作為單元測試默認庫,在此之前,spring-boot-starter-test包含的是JUnit 4的依賴,Spring Boot 2.2.0版本之后替換成了Junit Jupiter(Junit5)。
Vintage Engine屬於Junit5的一個模塊,它的作用是:允許用JUnit 5運行用JUnit 4編寫的測試,從而提供了向下兼容的能力。
從2.2.0到現在經過了2個版本的迭代,到Spring Boot 2.4.0這個版本決定了把Vintage Engine從spring-boot-starter-test正式移除。因此:若你的工程仍需要對JUnit4支持,那么請手動引入依賴項(如果工程量不大,強烈建議使用JUnit5,比4好用太多)
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>
說明:其實在2.4.0之前,若你是從https://start.spring.io生成的項目其實也是不會帶有vintage-engine的。只不過它是通過顯式的在pom里通過exclusion標簽來排除的