Spring boot 版本更新记录
Spring Boot 次要版本更新日志记录,也凭借着更新的内容,去追随一个更优雅的方向,本文内容将随着Spring Boot的版本迭代长期更新。
2.6 Release Note
具体更新内容见Spring Boot 2.6 Release Note
相较于2.5版本的升级内容
- Bean循环引用默认被禁止,应用中原有的循环引用将抛出
BeanCurrentlyInCreationException
异常,Spring官方的建议是修改逻辑以打破循环引用,若无法这么做,可以通过配置spring.main.allow-circular-references
为true
恢复循环引用依赖的功能 - Spring MVC的路径解析处理器将由
AntPathMatcher
替换为PathPatternMatcher
,其中部分匹配策略和之前有变更,如有需求切换回AntPathMatcher
可通过将spring.mvc.pathmatch.matching-strategy
配置为ant-path-matcher
- Spring Actuator中的
/info
端点的环境信息默认将被禁用 - Web资源配置中,直接注入Resource在SpringBoot 2.6中将不再有效,可以通过注入WebResource进行配置替代
- Spring Boot 2.6中已支持嵌入式Mongo,如要使用需通过配置
spring.mongodb.embedded.version
属性配置嵌入式Mongo版本 - 在使用Java16作为开发包的应用中,如果使用了
@ConfigurationProperties
,且配置类只有一个构造方法,则不需要显示标注@ConstructorBinding
,如有多个构造方法,则仍会通过标定的构造方法进行属性绑定
新特性
- Servlet将支持Cookies的
SameSite
配置,其适用于Tomcat/Jetty/Undertow
- 响应式服务端也将支持Session属性
- Spring Actuator的Info端点将支持显示Java运行时信息
- Docker镜像构建将支持添加
tags/networks/cache
配置信息 - 健康检测检查功能更新
- 在引入了
commons-pool2
的情况下redis连接池将支持通过spring.redis.[jedis/lettuce].pool.enable
进行启用和禁用
2.5 Release Note
相较于2.4版本的升级内容
- SQL脚本数据源初始化方法被重新设计,原有的
spring.datasource.*
初始化配置已被弃用,取而代之的是spring.sql.init.*
属性- 在Spring Boot 2.5.1及之后的版本,SQL初始化属性将支持内嵌数据源、JDBC、R2DBC数据源,但是在默认情况下,SQL的初始化逻辑只会针对于内嵌数据库执行,如果要初始化SQL数据库,还需要把
spring.sql.init.mode
设置为always
状态,关闭则设为never
状态
- 在Spring Boot 2.5.1及之后的版本,SQL初始化属性将支持内嵌数据源、JDBC、R2DBC数据源,但是在默认情况下,SQL的初始化逻辑只会针对于内嵌数据库执行,如果要初始化SQL数据库,还需要把
- Spring Data JPA 提供了
getById
方法以替换getOne
方法,如果应用中已存在getById
方法,则会在启动时抛出LazyLoadingException
异常,可通过修改现存的getById
的方法名进行处理 - Spring Boot 2.5版本中移除了
对SpringDataSolr
自动装配支持 - Spring Actuator 的
/info
端点将默认不在Web端暴露 - Spring Integration将复用应用中可用的
TaskScheduler
而不会去创建其独有的任务调度器,即会使用默认Pool Size为1的任务调度器,如有需求,可以通过调整spring.task.scheduling.pool.size
去配置线程数量 - Spring Boot中Web和validation默认的表达式解析器已经由
Glassfish
替换为Tomcat-embed-el
- 消息属性将默认从错误页面移除,如有需要,可通过
server.error.include-message
属性进行控制 - 添加了日志销毁钩子以保证日志资源在JVM退出时被释放
- Spring Boot的默认Groovy版本升级到3.x
- Spring Boot所依赖的Gradle构建版本升级到6.8或更新
- 默认的Hibernate Validate版本升级到6.2.x,更改了表达式语言用于插入验证信息的方式
- Spring Boot 2.3废弃的代码将被删除,2.4版本废弃的代码将在2.6版本被删除
新特性
- 支持对系统参数配置设置公共前缀以在同一个环境运行多个不同版本的Spring Boot应用
1 | SpringApplication application = new SpringApplication(MyApp.class); |
所有的Web容器添加了对于h2c的支持
支持通过R2DBC驱动初始化数据库
Spring Boot Maven / Gradle插件将支持创建分层War以提高Docker镜像构建效率
Docker镜像构建支持
Spring Boot 2.5针对Java16进行了支持,并且最低支持版本仍是Java8
Spring Boot Gradle 插件支持Gradle 7.0.x
2.4 Release Note
具体更新内容详见Spring Boot 2.4 Release Notes
相较于2.3版本的升级内容
- Spring项目版本命名逻辑修改
- 修改为
主版本.次版本.补丁版本-修饰符[M(里程碑)|RC(候选版本)|SNAPSHOT(快照版本)]
- 即在在2.4.0版本之前的
2.3.5.RELEASE
将升级到2.4.0
- 修改为
spring-boot-starter
移除了对Junit5的Vintage引擎支持,即不再兼容JUnit4.x、Junit3.x的测试用例- 修改了配置文件的处理方式(主要涉及不同环境版本配置active逻辑,其他内容无大影响)
spring.config.location
和spring.config.import
配置项用于引入外部配置将不再静默失败,如果需要静默失败可以通过添加optional
配置spring.config.location=optional:/etc/config/application.properties
Logback
配置属性名在2.4版本中有部分修改,原有配置将被废弃- 2.4版本中,将不再注册自定义的Servlet容器作为默认容器,在大多数应用中
MVC
的DispatcherServlet
将是唯一需要的容器- 如仍有对Default Servlet的需要,可以通过将
server.servlet.register-default-servlet
属性配置为true
- 如仍有对Default Servlet的需要,可以通过将
- 默认情况下,Spring Actuator的Http Trace将不再追踪Cookie信息,如有需要可以给
management.trace.http.include
配置cookies, errors, request-headers, response-headers
属性值进行按需Trace ElasticService
的LowLevelRestClient
将不被自动装配,而RestHighLevelClient
还将继续支持- Spring Boot Gradle 插件
bootJar
将通过mainClass
的方式设置启动类 - Spring Boot 2.2版本中弃用的代码将在2.4版本中被删除,2.3版本中被弃用的代码将在2.5版本中被删除
新特性
- Spring boot 2.4对应的
SpringFramework
版本将升级到5.3,对应的Spring Data版本将升级到2020.0
- 增加了对Java15的支持,最低支持版本为Java8
- 增加了自定义配置的名称支持,可以通过
@Name
注解进行标识
1 |
|
- 2.3 版本的镜像Jar分层机制将成为默认选项
- 可以通过
spring.config.import
引入一个或多个配置文件到Spring Environment中 - 为了适应部分云平台只能引入无扩展名配置文件增加了支持,可以通过
spring.config.import=/etc/myconfig[.yaml]
配置,将myconfig
文件作为yaml
形式引入 - Spring Actuator增加了新的
Startup Endpoint
,以帮助分析定位创建时间过长的Bean - Docker / Maven / Gradle的打包支持
- 增加了对于Redis的指标记录功能,包括命中率,增加/获取/删除数量等,可以通过配置
spring.cache.redis.enable-statistics
属性对特性进行开启 - 2.4版本后将不再支持Servlet / Filter的动态注册
- 增加了故障分析器,其将分析环境处理期间引发的任何异常
- Jar优化,在打包过程中,只具有包引用传递的部分starter jar将不再被包含在最终Jar里
2.3 Release Note
具体更新内容详见(Spring Boot 2.3 Release Notes)[https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.3-Release-Notes]
相较于2.2版本的升级内容
- 移除了对Maven的依赖,转投向通过Gradle进行项目构建
- Gradle 6.3+ (5.6.x 版本其实也行,但是其已经是过期版本了)
- Jetty 9.4.22+ (如果使用了Jetty作为内嵌的Servlet容器)
- 移除了
spring-boot-web-starter
中的Validation
模块,如有需要则需要在包管理中引用 - 默认情况下会给自动配置的数据源生成唯一的名称,可通过
spring.datasource.generate-unique-name
配置为false
将此行为关闭 - Spring Data Neumann
- 在2.3版本的Boot更新中附带了
Spring Data
的主要版本更新,影响范围包括Cassandra
,Couchbase
,Elasticsearch
,MongoDB
,JDBC
. - Spring Data 对于Es的支持提升到7.5+以上的版本
- 在2.3版本的Boot更新中附带了
- Spring Boot 2.3所携带的
Jackson
版本升级到2.11,修改了Date / Calendar
的默认格式 - Spring Boot Web内嵌的Servlet Server线程配置移动至线程专用组
server.jetty.threads
/server.tomcat.threads
/server.undertow.threads
- 修改了默认错误页的文本内容
- 错误信息将不再被包含在错误页中,以减少向客户端泄露敏感信息的危险,额外信息绑定将可以通过
server.error.include-message
和server.error.include-binding-errors
配置项进行实现
- 错误信息将不再被包含在错误页中,以减少向客户端泄露敏感信息的危险,额外信息绑定将可以通过
- 为了和
SpringApplication
保持一致,ApplicationContextRunner
的实现将禁止Bean覆盖(通过创建同名Bean,对原有Bean进行覆盖)。如有测试覆盖需要,可以通过SpringApplication.withAllowBeanDefinitionOverriding
方法进行许可配置 @ActiveProfiles
注解将支持多配置文件,即使用@ActiveProfiles("dev,pro")
将被认为是一个配置文件,如要启动多配置文件,则需要使用@ActiveProfiles({"dev", "pro"})
- 修改了
WebServerInitializedEvent
事件的出发时间,其将在ApplicationContext#refresh
后立即执行而不是在刷新流程完全完成后执行,因此WebServerInitializedEvent
将在ContextRefreshedEvent
事件之前执行
新特性
- Spring Boot 2.3添加了对于Java14的支持(Java8 / 11也依然支持)
- 在Docker镜像中构建分层Jar包以提高镜像构建效率
- 增加了对R2DBC(响应式数据库驱动)的支持
- 在Fat Jar中添加索引文件以保证在展开Fat Jar时,
classpath
的加载顺序一致 - 支持通过通配符的模式获取配置文件,例如
config/*/
以获取config/mysql/application.properties
和/config/redis/application.properties
- 添加
server.shutdown=graceful
的配置以支持优雅停机,在优雅停机后服务器将不接受新的请求并将等待现有活动完成,等待时间可以通过spring.lifecycle.- timeout-per-shutdown-phase
进行配置 - Spring Actuator 新特性