千里之行,始於足下。關注公衆號【BAT的烏托邦】,有Spring技術棧、MyBatis、JVM、中間件等小而美的原創專欄供以避免費學習。分享、成長,拒絕淺嘗輒止。本文已被 https://www.yourbatman.cn 收錄。html
你好,我是YourBatman。java
北京時間2020-11-12,Spring Boot 2.4.0
正式發佈。2.4.0是第一個使用新版本方案的Spring Boot發行版本。mysql
注意:2.4.0版本號沒有
.RELEASE
後綴,沒有.RELEASE
後綴,沒有.RELEASE
後綴。使用的是Spring最新的版本發佈規則。此規則詳解請參考上篇文章:Spring改變版本號命名規則:此舉對非英語國家很友好git
還記得Spring Boot 2.3.0.RELEASE
版本發佈時那會麼?先後相差將好半年:
直達電梯:Spring Boot 2.3.0正式發佈:優雅停機、配置文件位置通配符新特性一覽程序員
通常來講,次版本號的升級會有點料,根據以前的爆料這次升級聽說是作了大量的更新和改進。那麼老規矩,做爲小白鼠的我先代你玩一玩,初體驗吧。github
也可參見官方的更新日誌:Spring Boot 2.4.0 Release Notesweb
除了剛發佈的Spring Boot 2.4.0,Spring Boot 2.3.x/2.2.x仍舊是活躍的維護的版本。Spring Boot遵循的是Pivotal OSS
支持策略,從發佈日期起支持主要版本3年(注意:是主要版本)。下面是詳情:redis
2.3.x
:支持的版本。2020.05發佈,是如今的活躍的主幹2.2.x
:支持的版本。2019.10發佈,是如今的活躍的主幹2.1.x
:2018.10發佈,支持到2020.10月底,建議儘快升級EOL分支:spring
2.0.x
:2018.3發佈,2019.4.3中止維護1.5.x
:生命已終止的版本。2017.1發佈,是最後一個1.x分支,2019.8.1中止維護可能大部分小夥伴都還沒用過2.3.x分支,沒想到2.4.x就已發佈。所以這裏先對2.3.x版本的新特性,來波簡單回憶:sql
spring.lifecycle.timeout-per-shutdown-phase=xxx
來配置,默認值是30s。/config/mysql/application.properties
/config/redis/application.properties
5.2.x
版本
spring-boot-starter-web
不會再把validation帶進來,因此若使用到,你須要本身添加這個spring-boot-starter-validation
依賴
作足功課後,就開始最新的Spring Boot 2.4.0之旅吧。
這個改變最爲重磅,本次改變了配置文件的加載邏輯,旨在簡化和合理化外部配置的加載方式,它可能具備不向下兼容性。
Spring Boot 2.4改變了處理application.properties
和application.yml
文件的方式:
application-profile.properties/yaml
這種(或者使用了Spirng Cloud的配置中心、(帶有分隔符----的)多yaml文件),那麼默認是不向下兼容的,須要你顯式的作出些更改由於配置文件隸屬於程序的一部分,特別是咱們如今幾乎都會使用到配置中心。所以下面針對於老版本升級到Spring Boot 2.4.0作個簡單的遷移指導。
說明:因配置文件加載邏輯徹底進行了重寫,所以詳細版本我放到了下文專文講解,有興趣可保持關注
老版本:2.4.0以前的版本都叫老版本。
Spring Boot 2.4對application.poperties/yaml
的處理作了更新/升級。旨在簡化和合理化外部配置的加載方式。它還提供了新功能:spring.config.import
支持。因此呢,對於Spring Boot 2.4.0以前的版本(老版本)若升級到2.4.0須要作些修改,指導建議以下:
若是你還未準備好作配置遷移的修改,Spring Boot也幫你考慮到了,提供了一鍵切換到舊模式的「按鈕」。具體作法是:只須要在Environment
裏增長一個屬性spring.config.use-legacy-processing = true
就搞定。最簡的方式就是把這個屬性放在application.poperties/yaml裏便可。
spring.config.use-legacy-processing = true
增長此配置後,Spring Boot對配置文件的解析恢復到原來模式:仍舊使用ConfigFileApplicationListener
去解析。
ConfigFileApplicationListener
屬於Spring Boot很是核心的底層代碼,此次作了不向下兼容的改進,可見它對進擊雲原生的決心
值得注意的是:此API在2.4.0已被標記爲過時:
// @since 1.0.0 // @deprecated since 2.4.0 in favor of {@link ConfigDataEnvironmentPostProcessor} @Deprecated public class ConfigFileApplicationListener implements EnvironmentPostProcessor, SmartApplicationListener, Ordered { ... }
按照Spring Boot的版本策略,此類將在Spring Boot 2.6.0版本被移除。所以:若不是無可奈何(時間緊急),並不建議你用兼容手法這麼去作,由於這將成爲技術債,早晚要還的。
說明:不少RD其實只會看到當前的方便,得到利益(好比快速上線獲獎),坑交給後人。我我的認爲做爲程序員應該有必定自我修養,自我追求,不爲一時的爽而持續給團隊積累債務,畢竟積重難返。
若你對配置文件的使用有以下情行,那麼你須要作遷移:
spring.profiles
配置項Spring Boot 2.4.0升級對配置文件的改動是最大的,而且還不具有向下兼容性,簡單的說就是今後版本開始要把Spring Boot的配置文件加載機制重學一遍(好比還增長了spring.config.import
,增長了對kubernetes配置的支持等等),而且還要學會如何遷移。
爲了更好的描述好這個很是很是重要的知識點,下篇文章我會用專文來全面介紹 Spring Boot這套全新的配置文件加載機制,而且輔以原理,以及和過去方式的比較,幫助你更全面、更快速、更勞的掌握它,歡迎持續關注。
說明:Spring Boot的配置文件加載機制很是很是重要,由於你也知道你平時開發中很大程度其實是在跟它的配置項打交道。新的配置加載方式比老的更加優秀,適應發展,敬請期待
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標籤來排除的
改進嵌入式數據庫檢測機制:僅當數據庫在內存中時纔將其視爲嵌入式數據庫。因此若是使用H二、HSQL等產品,可是你是基於文件的持久性或使用的是服務器模式,那麼將不會檢測爲內存數據庫。而對於非內存數據庫,你可能須要額外作以下動做:
spring.datasource.username = sa
spring.datasource.initialization-mode
的值Logback一些配置項更名了,更加表名了它是logback的配置項。
新增了配置類
LogbackLoggingSystemProperties
用於對應,它繼承自以前的LoggingSystemProperties
以前的配置項有些被廢棄(此版本還未刪除,後續版本確定會刪除的),對應關係以下:
新 | |
---|---|
logging.logback.rollingpolicy.file-name-pattern | |
logging.logback.rollingpolicy.clean-history-on-start | |
logging.logback.rollingpolicy.max-file-size | |
logging.logback.rollingpolicy.total-size-cap | |
logging.logback.rollingpolicy.max-history |
一些屬性是被放到system environment裏面的:
新 | |
---|---|
~~ROLLING_FILE_NAME_PATTERN ~~ | LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN |
LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START | |
LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE | |
LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP | |
LOGBACK_ROLLINGPOLICY_MAX_HISTORY |
從Spring Boot 2.4開始,默認將不會再註冊DefaultServlet
。由於在絕大多數的應用中,Spring MVC提供的DispatcherServlet
是惟一須要被註冊的Servlet。從源碼處感覺下此次改動:
AbstractServletWebServerFactory: // 2.4.0以前版本,默認值是true private boolean registerDefaultServlet = true; // 2.4.0以及以後版本,默認值是false private boolean registerDefaultServlet = false;
固然嘍,若你的工程強依賴於此Servelt,那麼能夠經過此配置項server.servlet.register-default-servlet = true
把它註冊上去。
它是Java EE提供的標準技術,如Tomcat、Jetty等都提供了這個類。簡而言之它的做用就是兜底(攔截/
),當別的servlet都沒匹配上時就交給它來處理,通常用於處理靜態資源如.jpg,.html,.js
這類的靜態文件。
DefaultServlet
在傳統web容器裏,會被配置在tomcat目錄(此處以tomcat爲例)下的conf/web.xml
裏:
<servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
說明:tomcat下的web.xml對其加載的全部的Application都生效,而且最終和Application本身的web.xml內容合併,遇相同的話後者優先級更高
在Spring Boot 嵌入式容器裏配置是這樣的(徹底等價於xml配置):
private void addDefaultServlet(Context context) { Wrapper defaultServlet = context.createWrapper(); defaultServlet.setName("default"); defaultServlet.setServletClass("org.apache.catalina.servlets.DefaultServlet"); defaultServlet.addInitParameter("debug", "0"); defaultServlet.addInitParameter("listings", "false"); defaultServlet.setLoadOnStartup(1); // Otherwise the default location of a Spring DispatcherServlet cannot be set defaultServlet.setOverridable(true); context.addChild(defaultServlet); context.addServletMappingDecoded("/", "default"); }
值得注意的是:Spring Boot註冊的DispatcherServlet
的path也是/
(覆蓋掉了DefaultServelt
)。在Spring MVC環境下假若是靜態資源,也不用DefaultServelt費心,Spring MVC專門提供了一個DefaultServletHttpRequestHandler
用於處理靜態資源(雖然最終仍是Dispatcher給defaultServlet
去搞定)。
如今的Spring Boot服務大都是REST服務,並沒有靜態資源須要提供,所以就沒有必要啓用DefaultServletHttpRequestHandler
和註冊DefaultServlet
來增長沒必要要的開銷嘍。
Http traces默認將再也不包含請求頭Cookie
以及響應頭Set-Cookie
。源碼處感覺一下:
org.springframework.boot.actuate.trace.http.Include: // 2.4.0版本以前:包含COOKIE_HEADERS這個頭 static { Set<Include> defaultIncludes = new LinkedHashSet<>(); defaultIncludes.add(Include.REQUEST_HEADERS); defaultIncludes.add(Include.RESPONSE_HEADERS); defaultIncludes.add(Include.COOKIE_HEADERS); defaultIncludes.add(Include.TIME_TAKEN); DEFAULT_INCLUDES = Collections.unmodifiableSet(defaultIncludes); } // 2.4.0版本以及以後:不包含COOKIE_HEADERS這個頭 static { Set<Include> defaultIncludes = new LinkedHashSet<>(); defaultIncludes.add(Include.REQUEST_HEADERS); defaultIncludes.add(Include.RESPONSE_HEADERS); defaultIncludes.add(Include.TIME_TAKEN); DEFAULT_INCLUDES = Collections.unmodifiableSet(defaultIncludes); }
若你仍舊想保留老的習慣,那麼請用配置項management.trace.http.include = cookies, errors, request-headers, response-headers
自行控制。
這個版本對Neo4j的支持進行了重大調整。直接用源碼來講明差別:
Spring Boot 2.4.0以前版本:
@ConfigurationProperties(prefix = "spring.data.neo4j") public class Neo4jProperties implements ApplicationContextAware { ... } // 無Neo4jDataProperties配置類
Spring Boot 2.4.0以及以後版本:
@ConfigurationProperties(prefix = "spring.neo4j") public class Neo4jProperties { ... } @ConfigurationProperties(prefix = "spring.data.neo4j") public class Neo4jDataProperties { ... }
@ConfigurationProperties(prefix = "sample") public class SampleConfigurationProperties { private final String importValue; // import是Java關鍵字 public SampleConfigurationProperties(@Name("import") String importValue) { this.importValue = importValue; } }
@Name註解是Spring Boot 2.4.0新增的註解,能標註在
ElementType.PARAMETER
上
ApplicationStartup
和StartupStep
這個兩個API是如何作追蹤的spring.cache.redis.enable-statistics = true
spring.web.locale、spring.web.locale-resolver、spring.web.resources.*、management.server.base-path
,這些屬性既支持Servlet也支持WebFlux
spring.mvc.locale/spring.mvc.locale-resolver/spring.resources.*/management.server.servlet.context-path
均以標註爲過時spring.flyway.url/user/password
(開源版本);spring.flyway.cherry-pick/jdbc-properties...
(團隊版本)spring.h2.console.settings.web-admin-password
屬性配置經過密碼訪問H2控制檯@Deprecated
的在2.4.0版本會被刪除,在2.3版本中被標記爲@Deprecated
的計劃在2.5.0版本中將其移除這是A哥奉給你們的,對Spring Boot2.4.0版本新特性的介紹,但願對你有些幫助。
Spring Boot 2.4.0版本的升級目標,基本和Spring Framework 5.3.0保持一致:爲雲原生作努力。表如今除了刪除些無用類,禁止不須要的類的加載外,重點還會體如今它對配置文件加載機制的重構上,這將是下文的內容,也是本次升級的重頭戲,敬請關注。
Spring Boot重寫了對配置文件的加載機制,而且新引入了近40個類來處理(老方式僅有區區幾個類),可見其重視、重要程度。所以,爲了適應將來的發展,你必定要掌握,而且越早越好,下篇將爲你揭曉。