重磅!Spring Boot 2.6 正式发布,一大波新特性,看完我彻底躺平了。。
点击关注公众号,Java干货及时送达
Spring Boot 2.6.0 来了
太猛了!Spring Boot 2.5.6 发布不到一个月,Spring Boot 又接连发布了三个版本:
Spring Boot 2.6.0(最新) Spring Boot 2.5.7 Spring Boot 2.4.13
后面两个版本都是修复 bug 版本,2.6.0 才是硬菜。。
先给大家奉上几个版本的 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 的最新版本情况:
版本 | 发布时间 | 停止维护时间 |
---|---|---|
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 | 已停止维护 |
2.1.x | 2018/10 | 已停止维护 |
2.0.x | 2018/03 | 已停止维护 |
1.5.x | 2017/01 | 已停止维护 |
可以看到,Spring Boot 2.6.0 本计划在今年 12 月发布的,没想到居然提前一个月发布了,还挺突然的。。
废话少说,重点来看下 Spring Boot 2.6.0 都更新了什么鬼?
Spring Boot 2.6.0 新特性
1、默认禁止循环引用
我们都知道,如果两个 Bean 互相注入对方就会存在循环引用问题,如下代码所示:
UserService:
/**
* 作者:栈长
* 来源微信公众号:Java技术栈
*/
@Service
public class UserService {
@Autowired
LogService logService;
}
LogService:
/**
* 作者:栈长
* 来源微信公众号:Java技术栈
*/
@Service
public class LogService {
@Autowired
UserService userService;
}
这两个 Bean 互相引用对方,就是循环引用了。
现在,2.6.0 这个版本已经默认禁止 Bean 之间的循环引用,如果存在循环引用就会启动失败报错:
解决方案:
1)整改业务,清理掉所有存在循环引用的 Bean;
2)设置允许循环引用:
spring:
main:
allow-circular-references: true
也可以通过 SpringApplication 和 SpringApplicationBuilder 设置 ,如:
/**
* 作者:栈长
* 来源微信公众号:Java技术栈
*/
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
// 允许循环引用
application.setAllowCircularReferences(true);
application.run(args);
}
2、支持 Cookie SameSite 属性
现在可以使用 server.session.cookie.same-site
属性在 servlet 应用程序的会话 cookie 上配置 SameSite
属性,这个适用于自动配置的 Tomcat、Jetty 和 Undertow 应用服务器,自定义的尚不可知。
server.session.cookie.same-site
支持的三个配置:
SameSite 参考值说明:
None(关闭模式,必须同时设置 Secure) Lax(宽松模式,允许部分第三方 Cookie,如:Get 表单请求、链接跳转等) Strict(严格模式,完全禁止第三方 Cookie,URL 一致时才发送 Cookie)
SameSite 扫盲:
SameSite 是浏览器针对 Cookie 新增的属性,主要用来限制第三方 Cookie,以防止 CSRF 攻击。
如 Google 搜索的响应头:
另外,如果你想将 SameSite
属性应用于其他 cookie,可以使用 CookieSameSiteSupplier
接口。
更多细节可以参考:
https://docs.spring.io/spring-boot/docs/2.6.0/reference/html//web.html#web.servlet.embedded-container.customizing.samesite
3、响应式应用服务器会话属性
响应式应用服务器支持的会话属性已在此版本中扩展。
以前是在 spring.webflux.session
下,现在在 server.reactive.session
下,并且提供与 servlet 版本相同的属性。
4、支持自定义脱敏规则
Spring Boot 现在可以清理 /env
和 /configprops
端点中存在的敏感值。
另外,还可以通过添加类型为 SanitizingFunction 的 @Bean 类来配置自定义清理规则。这个感觉挺重要的,不能在端点中显示敏感信息的,后面栈长研究下再分享,关注公众号 Java技术栈,第一时间推送。
5、重要端点变更
环境变量 /env
端点已经默认不开放了,可以通过以下配置开启:
management.info.env.enabled = true
另外,Spring Boot 下的 /info
端点现在可以公开 Java 运行时信息了,如以下示例 java
节点所示:
{
"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"
}
}
}
设置方法:
management.info.java.enabled = true
6、构建信息属性排除
现在可以从 Spring Boot Maven 或 Gradle 插件生成的 build-info.properties 文件中排除特定属性。
比如,排除 Maven 的 version 属性:
version
7、 Redis 连接池
当 commons-pool2
在类路径下时,Redis(包括:Jedis 和 Lettuce)支持自动开启连接池。
也可以设置禁用连接池:
spring.redis.jedis.pool.enabled = false
或
spring.redis.lettuce.pool.enabled = false
8、WebTestClient 测试
现在可以使用 WebTestClient 在 Mock 环境中测试 WebFlux 应用,也可以对实时服务器测试任何 Spring Web 应用程序。
这是一个什么样的测试呢?为什么又搞这个测试?这个后面栈长有时间研究下再分享,关注公众号 Java技术栈,第一时间推送。
9、支持 Log4j2 复合配置
现在支持 Log4j2 的复合配置,可以通过 logging.log4j2.config.override
参数来指定覆盖主日志配置文件的其他日志配置文件。
10、依赖升级
官方项目升级到新版本:
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、弃用和删除项
1)AbstractDataSourceInitializer 类已被弃用,取而代之的是 DataSourceScriptDatabaseInitializer。另外,AbstractDataSourceInitializer 的子类也已被弃用,取而代之的是新的基于 DataSourceScriptDatabaseInitializer 的类。
2)SpringPhysicalNamingStrategy 类已被弃用,取而代之的是 Hibernate 5.5 的 CamelCaseToUnderscoresNamingStrategy 类。
3)AbstractApplicationContextRunner 类中的三个方法已被弃用,取而代之的是新的基于 RunnerConfiguration 的类。
4)SpringApplicationRunListener 中的 started
和 running
方法已被弃用,取而代之的是接受 Duration 参数的新方法:
参数是有了,方法里面怎么没用到?什么鬼。。这可能是为下个版本彻底移除做伏笔吧!
5)同第 4)点,ApplicationStartedEvent 和 ApplicationReadyEvent 中的构造函数也已被替换为接受 Duration 参数的版本:
6)EnvironmentEndpoint.sanitize 被标识弃用了。
7)Oracle 数据库驱动程序的依赖管理已得到简化,Oracle 驱动包 GroupID com.oracle.ojdbc
需要升级为 com.oracle.database.jdbc
,现在已经删除了对前者的依赖管理。
另外,在 Spring Boot 2.4 版本当中标识为弃用的类、方法和属性已在此版本中彻底删除,这个升级就要注意了,如果用了应该会出现编译错误。
总结
除了上面列出的更改之外,在 Docker 镜像、健康检查、指标监控上都有增强、另外还有许多小的调整和改进,这里就不一一介绍了,可以看下官方发布说明:
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.6-Release-Notes
Spring Boot 2.6.0 变动真的还挺多的,看看大家都用到了啥,再考虑升级,如果只是学习研究使用,可以随便升,但如果是生产环境,请慎重考虑了,个人建议没有必要跟最新版本。。
Spring Boot 现在已经成为了实事上的脚手架框架了,让学习和开发变得更简单,同时也让我感觉技术更新实在太快了啊,所以我们也要不断保持学习,不然也会跟着淘汰。
如果你还没用过 Spring Boot,今天我就送你一份 《Spring Boot 学习笔记》这个很全了,包括底层实现原理及代码实战,非常齐全,助你快速打通 Spring Boot 的各个环节。
往期 Spring Boot 教程及示例源码整理:
https://github.com/javastacks/javastack
最后,你们用的哪个 Spring Boot 版本呢?
欢迎来投票统计看下!
好了,今天的分享就到这里了,后面栈长会分享更多好玩的 Java 技术和最新的技术资讯,关注公众号Java技术栈第一时间推送,我也将主流 Java 面试题和参考答案都整理好了,在公众号后台回复关键字 "面试" 进行刷题。
最后,觉得我的文章对你用收获的话,动动小手,给个在看、转发,原创不易,栈长需要你的鼓励。
版权声明: 本文系公众号 "Java技术栈" 原创,原创实属不易,转载、引用本文内容请注明出处,抄袭者一律举报+投诉,并保留追究其法律责任的权利。
关注Java技术栈看更多干货