重磅!Spring Boot 2.6 正式發(fā)布,一大波新特性,看完我徹底躺平了。。
點(diǎn)擊關(guān)注公眾號,Java干貨及時(shí)送達(dá)
Spring Boot 2.6.0 來了

太猛了!Spring Boot 2.5.6 發(fā)布不到一個(gè)月,Spring Boot 又接連發(fā)布了三個(gè)版本:
Spring Boot 2.6.0(最新) Spring Boot 2.5.7 Spring Boot 2.4.13
后面兩個(gè)版本都是修復(fù) bug 版本,2.6.0 才是硬菜。。
先給大家奉上幾個(gè)版本的 Maven 依賴:
Spring Boot 2.6.0:
??org.springframework.boot
??spring-boot-starter-parent
??2.6.0
??<type>pomtype>
Spring Boot 2.5.7:
??org.springframework.boot
??spring-boot-starter-parent
??2.5.7
??<type>pomtype>
Spring Boot 2.4.13:
??org.springframework.boot
??spring-boot-starter-parent
??2.4.13
??<type>pomtype>
需要注意的是,2.4.x 版本開始版本號不帶 .RELEASE 后綴了!
棧長之前整理了 Spring Boot 的最新版本情況:
| 版本 | 發(fā)布時(shí)間 | 停止維護(hù)時(shí)間 |
|---|---|---|
| 2.7.0 | 2022/05 | - |
| 2.6.0 | 2021/12/18 | - |
| 2.5.x | 2021/05/20 | 2023/02/20 |
| 2.4.x | 2020/12/12 | 2022/08/12 |
| 2.3.x | 2020/05/15 | 2022/02/15 |
| 2.2.x | 2019/10 | 已停止維護(hù) |
| 2.1.x | 2018/10 | 已停止維護(hù) |
| 2.0.x | 2018/03 | 已停止維護(hù) |
| 1.5.x | 2017/01 | 已停止維護(hù) |
可以看到,Spring Boot 2.6.0 本計(jì)劃在今年 12 月發(fā)布的,沒想到居然提前一個(gè)月發(fā)布了,還挺突然的。。
廢話少說,重點(diǎn)來看下 Spring Boot 2.6.0 都更新了什么鬼?
Spring Boot 2.6.0 新特性

1、默認(rèn)禁止循環(huán)引用
我們都知道,如果兩個(gè) Bean 互相注入對方就會(huì)存在循環(huán)引用問題,如下代碼所示:
UserService:
/**
?*?作者:棧長
?*?來源微信公眾號:Java技術(shù)棧
?*/
@Service
public?class?UserService?{
????@Autowired
????LogService?logService;
}
LogService:
/**
?*?作者:棧長
?*?來源微信公眾號:Java技術(shù)棧
?*/
@Service
public?class?LogService?{
????@Autowired
????UserService?userService;
}
這兩個(gè) Bean 互相引用對方,就是循環(huán)引用了。
現(xiàn)在,2.6.0 這個(gè)版本已經(jīng)默認(rèn)禁止 Bean 之間的循環(huán)引用,如果存在循環(huán)引用就會(huì)啟動(dòng)失敗報(bào)錯(cuò):

解決方案:
1)整改業(yè)務(wù),清理掉所有存在循環(huán)引用的 Bean;
2)設(shè)置允許循環(huán)引用:
spring:
??main:
????allow-circular-references:?true
也可以通過 SpringApplication 和 SpringApplicationBuilder 設(shè)置 ,如:
/**
?*?作者:棧長
?*?來源微信公眾號:Java技術(shù)棧
?*/
public?static?void?main(String[]?args)?{
????SpringApplication?application?=?new?SpringApplication(Application.class);
????//?允許循環(huán)引用
????application.setAllowCircularReferences(true);
????application.run(args);
}
2、支持 Cookie SameSite 屬性
現(xiàn)在可以使用 server.session.cookie.same-site 屬性在 servlet 應(yīng)用程序的會(huì)話 cookie 上配置 SameSite 屬性,這個(gè)適用于自動(dòng)配置的 Tomcat、Jetty 和 Undertow 應(yīng)用服務(wù)器,自定義的尚不可知。
server.session.cookie.same-site 支持的三個(gè)配置:

SameSite 參考值說明:
None(關(guān)閉模式,必須同時(shí)設(shè)置 Secure) Lax(寬松模式,允許部分第三方 Cookie,如:Get 表單請求、鏈接跳轉(zhuǎn)等) Strict(嚴(yán)格模式,完全禁止第三方 Cookie,URL 一致時(shí)才發(fā)送 Cookie)
SameSite 掃盲:
SameSite 是瀏覽器針對 Cookie 新增的屬性,主要用來限制第三方 Cookie,以防止 CSRF 攻擊。
如 Google 搜索的響應(yīng)頭:

另外,如果你想將 SameSite 屬性應(yīng)用于其他 cookie,可以使用 CookieSameSiteSupplier 接口。
更多細(xì)節(jié)可以參考:
https://docs.spring.io/spring-boot/docs/2.6.0/reference/html//web.html#web.servlet.embedded-container.customizing.samesite
3、響應(yīng)式應(yīng)用服務(wù)器會(huì)話屬性
響應(yīng)式應(yīng)用服務(wù)器支持的會(huì)話屬性已在此版本中擴(kuò)展。
以前是在 spring.webflux.session 下,現(xiàn)在在 server.reactive.session 下,并且提供與 servlet 版本相同的屬性。
4、支持自定義脫敏規(guī)則
Spring Boot 現(xiàn)在可以清理 /env 和 /configprops 端點(diǎn)中存在的敏感值。
另外,還可以通過添加類型為 SanitizingFunction 的 @Bean 類來配置自定義清理規(guī)則。這個(gè)感覺挺重要的,不能在端點(diǎn)中顯示敏感信息的,后面棧長研究下再分享,關(guān)注公眾號 Java技術(shù)棧,第一時(shí)間推送。
5、重要端點(diǎn)變更
環(huán)境變量 /env 端點(diǎn)已經(jīng)默認(rèn)不開放了,可以通過以下配置開啟:
management.info.env.enabled?=?true
另外,Spring Boot 下的 /info 端點(diǎn)現(xiàn)在可以公開 Java 運(yùn)行時(shí)信息了,如以下示例 java 節(jié)點(diǎn)所示:
{
??"java":?{
????"vendor":?"BellSoft",
????"version":?"17",
????"runtime":?{
??????"name":?"OpenJDK?Runtime?Environment",
??????"version":?"17+35-LTS"
????},
????"jvm":?{
??????"name":?"OpenJDK?64-Bit?Server?VM",
??????"vendor":?"BellSoft",
??????"version":?"17+35-LTS"
????}
??}
}
設(shè)置方法:
management.info.java.enabled?=?true
6、構(gòu)建信息屬性排除
現(xiàn)在可以從 Spring Boot Maven 或 Gradle 插件生成的 build-info.properties 文件中排除特定屬性。
比如,排除 Maven 的 version 屬性:
?
??version
?
7、 Redis 連接池
當(dāng) commons-pool2 在類路徑下時(shí),Redis(包括:Jedis 和 Lettuce)支持自動(dòng)開啟連接池。
也可以設(shè)置禁用連接池:
spring.redis.jedis.pool.enabled?=?false
或
spring.redis.lettuce.pool.enabled?=?false?
8、WebTestClient 測試
現(xiàn)在可以使用 WebTestClient 在 Mock 環(huán)境中測試 WebFlux 應(yīng)用,也可以對實(shí)時(shí)服務(wù)器測試任何 Spring Web 應(yīng)用程序。
這是一個(gè)什么樣的測試呢?為什么又搞這個(gè)測試?這個(gè)后面棧長有時(shí)間研究下再分享,關(guān)注公眾號 Java技術(shù)棧,第一時(shí)間推送。
9、支持 Log4j2 復(fù)合配置
現(xiàn)在支持 Log4j2 的復(fù)合配置,可以通過 logging.log4j2.config.override 參數(shù)來指定覆蓋主日志配置文件的其他日志配置文件。
10、依賴升級
官方項(xiàng)目升級到新版本:
Spring Security 5.6 Spring Data 2021.1 Spring HATEOAS 1.4 Spring Kafka 2.8 Spring AMQP 2.4 Spring Session 2021.1.0
第三方依賴升級到新版本:
Apache Kafka 3.0 Artemis 2.19 Cassandra Driver 4.13 Commons DBCP 2.9 Commons Pool 2.11 Couchbase Client 3.2.2 Elasticsearch 7.15 Flyway 8.0.5 Hibernate 5.6 JUnit Jupiter 5.8 Jedis 3.7 Kafka 3.0 Kotlin 1.6 Liquibase 4.5 Micrometer 1.8 Mockito 4.0 MongoDB 4.4 Postgresql 42.3 QueryDSL 5.0 SnakeYAML 1.29 Thymeleaf Layout Dialect 3.0 .....
11、棄用和刪除項(xiàng)
1)AbstractDataSourceInitializer 類已被棄用,取而代之的是 DataSourceScriptDatabaseInitializer。另外,AbstractDataSourceInitializer 的子類也已被棄用,取而代之的是新的基于 DataSourceScriptDatabaseInitializer 的類。
2)SpringPhysicalNamingStrategy 類已被棄用,取而代之的是 Hibernate 5.5 的 CamelCaseToUnderscoresNamingStrategy 類。
3)AbstractApplicationContextRunner 類中的三個(gè)方法已被棄用,取而代之的是新的基于 RunnerConfiguration 的類。
4)SpringApplicationRunListener 中的 started 和 running 方法已被棄用,取而代之的是接受 Duration 參數(shù)的新方法:


參數(shù)是有了,方法里面怎么沒用到?什么鬼。。這可能是為下個(gè)版本徹底移除做伏筆吧!
5)同第 4)點(diǎn),ApplicationStartedEvent 和 ApplicationReadyEvent 中的構(gòu)造函數(shù)也已被替換為接受 Duration 參數(shù)的版本:

6)EnvironmentEndpoint.sanitize 被標(biāo)識棄用了。
7)Oracle 數(shù)據(jù)庫驅(qū)動(dòng)程序的依賴管理已得到簡化,Oracle 驅(qū)動(dòng)包 GroupID com.oracle.ojdbc 需要升級為 com.oracle.database.jdbc,現(xiàn)在已經(jīng)刪除了對前者的依賴管理。
另外,在 Spring Boot 2.4 版本當(dāng)中標(biāo)識為棄用的類、方法和屬性已在此版本中徹底刪除,這個(gè)升級就要注意了,如果用了應(yīng)該會(huì)出現(xiàn)編譯錯(cuò)誤。
總結(jié)
除了上面列出的更改之外,在 Docker 鏡像、健康檢查、指標(biāo)監(jiān)控上都有增強(qiáng)、另外還有許多小的調(diào)整和改進(jìn),這里就不一一介紹了,可以看下官方發(fā)布說明:
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.6-Release-Notes
Spring Boot 2.6.0 變動(dòng)真的還挺多的,看看大家都用到了啥,再考慮升級,如果只是學(xué)習(xí)研究使用,可以隨便升,但如果是生產(chǎn)環(huán)境,請慎重考慮了,個(gè)人建議沒有必要跟最新版本。。
Spring Boot 現(xiàn)在已經(jīng)成為了實(shí)事上的腳手架框架了,讓學(xué)習(xí)和開發(fā)變得更簡單,同時(shí)也讓我感覺技術(shù)更新實(shí)在太快了啊,所以我們也要不斷保持學(xué)習(xí),不然也會(huì)跟著淘汰。
如果你還沒用過 Spring Boot,今天我就送你一份 《Spring Boot 學(xué)習(xí)筆記》這個(gè)很全了,包括底層實(shí)現(xiàn)原理及代碼實(shí)戰(zhàn),非常齊全,助你快速打通 Spring Boot 的各個(gè)環(huán)節(jié)。
往期 Spring Boot 教程及示例源碼整理:
https://github.com/javastacks/javastack
最后,你們用的哪個(gè) Spring Boot 版本呢?
歡迎來投票統(tǒng)計(jì)看下!
好了,今天的分享就到這里了,后面棧長會(huì)分享更多好玩的 Java 技術(shù)和最新的技術(shù)資訊,關(guān)注公眾號Java技術(shù)棧第一時(shí)間推送,我也將主流 Java 面試題和參考答案都整理好了,在公眾號后臺回復(fù)關(guān)鍵字 "面試" 進(jìn)行刷題。
最后,覺得我的文章對你用收獲的話,動(dòng)動(dòng)小手,給個(gè)在看、轉(zhuǎn)發(fā),原創(chuàng)不易,棧長需要你的鼓勵(lì)。
版權(quán)聲明: 本文系公眾號 "Java技術(shù)棧" 原創(chuàng),原創(chuàng)實(shí)屬不易,轉(zhuǎn)載、引用本文內(nèi)容請注明出處,抄襲者一律舉報(bào)+投訴,并保留追究其法律責(zé)任的權(quán)利。







關(guān)注Java技術(shù)棧看更多干貨


