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 的最新版本情况:
可以看到,Spring Boot 2.6.0 本计划在今年 12 月发布的,没想到居然提前一个月发布了,还挺突然的。。
废话少说,重点来看下 Spring Boot 2.6.0 都更新了什么鬼?
Spring Boot 2.6.0 新特性
1、默认禁止循环引用
我们都知道,如果两个 Bean 互相注入对方就会存在循环引用问题,如下代码所示:
UserService:
/**
* 作者:栈长
* 来源微信公众号:Java技术栈
*/@Servicepublic class UserService {@AutowiredLogService logService;
}
LogService:
/**
* 作者:栈长
* 来源微信公众号:Java技术栈
*/@Servicepublic class LogService {@AutowiredUserService userService;
}
这两个 Bean 互相引用对方,就是循环引用了。
现在,2.6.0 这个版本已经默认禁止 Bean 之间的循环引用,如果存在循环引用就会启动失败报错:
解决方案:
1)整改业务,清理掉所有存在循环引用的 Bean;
2)设置允许循环引用:
spring:main:allow-circular-references:true
也可以通过 SpringApplication 和 SpringApplicationBuilder 设置 ,如:
/**
* 作者:栈长
* 来源微信公众号:Java技术栈
*/publicstaticvoidmain(String[] args){
SpringApplication application =newSpringApplication(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.htmlweb.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 属性:
<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 应用程序。
这是一个什么样的测试呢?为什么又搞这个测试?这个后面栈长有时间研究下再分享,关注 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 驱动包 GroupIDcom.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技术栈” 原创,原创实属不易,转载、引用本文内容请注明出处,抄袭者一律举报+投诉,并保留追究其法律责任的权利。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
丞旭猿论坛
暂无评论内容