重磅!Spring Boot 2.6 正式发布,一大波新特性,看完我彻底躺平了。。
The following article is from Java技术栈 Author 栈长
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:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.0</version>
<type>pom</type>
</dependency>
Spring Boot 2.5.7:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.7</version>
<type>pom</type>
</dependency>
Spring Boot 2.4.13:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.13</version>
<type>pom</type>
</dependency>
需要注意的是,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:
@Service
public class UserService {
@Autowired
LogService logService;
}
LogService:
@Service
public class LogService {
@Autowired
UserService userService;
}
这两个 Bean 互相引用对方,就是循环引用了。
现在,2.6.0 这个版本已经默认禁止 Bean 之间的循环引用,如果存在循环引用就会启动失败报错:
解决方案:
1)整改业务,清理掉所有存在循环引用的 Bean;
2)设置允许循环引用:
spring:
main:
allow-circular-references: true
也可以通过 SpringApplication 和 SpringApplicationBuilder 设置 ,如:
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 类来配置自定义清理规则。这个感觉挺重要的,不能在端点中显示敏感信息的。
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 属性:
<configuration>
<excludeInfoProperties>
<excludeInfoProperty>version</excludeInfoProperty>
</excludeInfoProperties>
</configuration>
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 应用程序。
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 版本呢?
欢迎来投票统计看下!
微信8.0将好友放开到了一万,小伙伴可以加我大号了,先到先得,再满就真没了
扫描下方二维码即可加我微信啦,2021,抱团取暖,一起牛逼。
推荐阅读
自从上了 SkyWalking,睡觉真香! 取代 Postman + Swagger!这款神器功能更强大,界面更炫酷! 干掉 PowerDesigner!这款国人开源的数据库设计工具真香! 当 Swagger 遇上 Torna,瞬间高大上了! 还在用Swagger?试试这款零注解侵入的API文档生成工具,跟Postman绝配! 干掉 BeanUtils!试试这款 Bean 自动映射工具,真心强大! 40K+Star!Mall电商实战项目开源回忆录! mall-swarm 微服务电商项目发布重大更新,打造Spring Cloud最佳实践!