Spring boot 版本更新记录
ShawJie

Spring Boot 次要版本更新日志记录,也凭借着更新的内容,去追随一个更优雅的方向,本文内容将随着Spring Boot的版本迭代长期更新。

2.6 Release Note

具体更新内容见Spring Boot 2.6 Release Note

相较于2.5版本的升级内容

  • Bean循环引用默认被禁止,应用中原有的循环引用将抛出BeanCurrentlyInCreationException异常,Spring官方的建议是修改逻辑以打破循环引用,若无法这么做,可以通过配置spring.main.allow-circular-referencestrue恢复循环引用依赖的功能
  • 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

具体更新内容见Spring Boot 2.5 Release Notes

相较于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 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
2
3
4
SpringApplication application = new SpringApplication(MyApp.class);
// 即所有参数都需要一个myapp前缀
application.setEnvironmentPrefix(“myapp”);
application.run(args);
  • 所有的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.locationspring.config.import配置项用于引入外部配置将不再静默失败,如果需要静默失败可以通过添加optional配置
    • spring.config.location=optional:/etc/config/application.properties
  • Logback配置属性名在2.4版本中有部分修改,原有配置将被废弃
  • 2.4版本中,将不再注册自定义的Servlet容器作为默认容器,在大多数应用中MVCDispatcherServlet将是唯一需要的容器
    • 如仍有对Default Servlet的需要,可以通过将server.servlet.register-default-servlet属性配置为true
  • 默认情况下,Spring Actuator的Http Trace将不再追踪Cookie信息,如有需要可以给management.trace.http.include配置cookies, errors, request-headers, response-headers属性值进行按需Trace
  • ElasticServiceLowLevelRestClient将不被自动装配,而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
4
5
6
7
8
9
10
@ConstructorBinding
@ConfigurationProperties(prefix = "sample")
public class SampleConfigurationProperties {

private final String importValue;
// 引入了sample.import注解的值
public SampleConfigurationProperties(@Name("import") String importValue) {
this.importValue = importValue;
}
}
  • 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+以上的版本
  • 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-messageserver.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 新特性