Spring Boot 2.4.0正式发布,全新的配置文件加载机制(不向下兼容)(上)

简介: Spring Boot 2.4.0正式发布,全新的配置文件加载机制(不向下兼容)(上)

✍前言



你好,我是YourBatman。


北京时间2020-11-12,Spring Boot 2.4.0正式发布。2.4.0是第一个使用新版本方案的Spring Boot发行版本。


注意:2.4.0版本号没有.RELEASE后缀,没有.RELEASE后缀,没有.RELEASE后缀。使用的是Spring最新的版本发布规则。此规则详解请参考上篇文章:Spring改变版本号命名规则:此举对非英语国家很友好


还记得Spring Boot 2.3.0.RELEASE版本发布时那会麽?前后相差将好半年:


image.png


直达电梯:Spring Boot 2.3.0正式发布:优雅停机、配置文件位置通配符新特性一览


一般来说,次版本号的升级会有点料,根据之前的爆料此次升级据说是做了大量的更新和改进。那么老规矩,作为小白鼠的我先代你玩一玩,初体验吧。


也可参见官方的更新日志:Spring Boot 2.4.0 Release Notes


✍正文


除了刚发布的Spring Boot 2.4.0,Spring Boot 2.3.x/2.2.x仍旧是活跃的维护的版本。Spring Boot遵循的是Pivotal OSS支持策略,从发布日期起支持主要版本3年(注意:是主要版本)。下面是详情:


  • 2.3.x:支持的版本。2020.05发布,是现在的活跃的主干
  • 2.2.x:支持的版本。2019.10发布,是现在的活跃的主干
  • 2.1.x:2018.10发布,支持到2020.10月底,建议尽快升级


EOL分支:


  • 2.0.x:2018.3发布,2019.4.3停止维护
  • 1.5.x:生命已终止的版本。2017.1发布,是最后一个1.x分支,2019.8.1停止维护


image.png


回忆2.3版本的新特性


可能大部分小伙伴都还没用过2.3.x分支,没想到2.4.x就已发布。因此这里先对2.3.x版本的新特性,来波简单回忆:


  1. 优雅停机。这是2.3.x主打的新特性:在关闭时,web服务器将不再允许新的请求,并将等待完成的请求给个宽限期让它完成。这个宽限期是可以设置的:可以使用spring.lifecycle.timeout-per-shutdown-phase=xxx来配置,默认值是30s。
  2. 配置文件位置支持通配符。简单的说,如果你有MySql的配置和Redis配置的话,你就可以把他们分开来放置,这个新特性也是棒棒哒。隔离性更好目录也更加清晰  了(注意:此格式只支持放在classpath外部):

            1.mysql:/config/mysql/application.properties

            2.redis:/config/redis/application.properties

 3.核心依赖升级。

  1.             1.Spring Data Neumann。备注:很明显这个还是旧的命名方式。在Spirng新的版本规则下,Spring Data最新版本为Spring Data 2020.0.0
  2.             2.Spring Session Dragonfruit(很明显这个也还是旧的命名方式)
  3. Spring Security 5.3
  4. Spring Framework 没有升级,使用的依旧是和Spring Boot 2.2相同的5.2.x版本

       1.说明:小版本号的升级对于新特性来说一般选择性忽略

  1. 关于Bean Validation:从此版本开始,spring-boot-starter-web不会再把validation带进来,所以若使用到,你需要自己添加这个spring-boot-starter-validation依赖

       1. 一般来说建议你手动引入,毕竟Bean Validation的使用还是很广泛,并且真的非常非常好用


做足功课后,就开始最新的Spring Boot 2.4.0之旅吧。


2.4.0主要新特性


全新的配置文件处理(properties/yaml)


这个改变最为重磅,本次改变了配置文件的加载逻辑,旨在简化和合理化外部配置的加载方式,它可能具有不向下兼容性。


Spring Boot 2.4改变了处理application.properties和application.yml文件的方式:


  • 若你只是简单的文件application.properties/yaml,那么升级对你是无缝的,你感受不到任何变化
  • 若你使用了比较复杂的文件,如application-profile.properties/yaml这种(或者使用了Spirng Cloud的配置中心、(带有分隔符----的)多yaml文件),那么默认是不向下兼容的,需要你显式的做出些更改


因为配置文件隶属于程序的一部分,特别是我们现在几乎都会使用到配置中心。因此下面针对于老版本升级到Spring Boot 2.4.0做个简单的迁移指导。


说明:因配置文件加载逻辑完全进行了重写,因此详细版本我放到了下文专文讲解,有兴趣可保持关注


老版本版本配置属性迁移指南


老版本:2.4.0之前的版本都叫老版本。


Spring Boot 2.4对application.poperties/yaml的处理做了更新/升级。旨在简化和合理化外部配置的加载方式。它还提供了新功能:spring.config.import支持。所以呢,对于Spring Boot 2.4.0之前的版本(老版本)若升级到2.4.0需要做些修改,指导建议如下:


方式一:恢复旧模式(不推荐)


如果你还未准备好做配置迁移的修改,Spring Boot也帮你考虑到了,提供了一键切换到旧模式的“按钮”。具体做法是:只需要在Environment里增加一个属性spring.config.use-legacy-processing = true就搞定。最简的方式就是把这个属性放在application.poperties/yaml里即可。


spring.config.use-legacy-processing = true

增加此配置后,Spring Boot对配置文件的解析恢复到原来模式:仍旧使用ConfigFileApplicationListener去解析。


ConfigFileApplicationListener属于Spring Boot非常核心的底层代码,这次做了不向下兼容的改进,可见它对进击云原生的决心


值得注意的是:此API在2.4.0已被标记为过期:


// @since 1.0.0
// @deprecated since 2.4.0 in favor of {@link ConfigDataEnvironmentPostProcessor}
@Deprecated
public class ConfigFileApplicationListener implements EnvironmentPostProcessor, SmartApplicationListener, Ordered {
  ...
}


按照Spring Boot的版本策略,此类将在Spring Boot 2.6.0版本被移除。因此:若不是迫不得已(时间紧急),并不建议你用兼容手法这么去做,因为这将成为技术债,迟早要还的。


说明:很多RD其实只会看到当前的方便,获得利益(比如快速上线获奖),坑交给后人。我个人认为作为程序员应该有一定自我修养,自我追求,不为一时的爽而持续给团队积累债务,毕竟积重难返。


方式二:按新规则迁移(推荐)


若你对配置文件的使用有如下情行,那么你需要做迁移:


  1. 多文档的yaml文件(带有----分隔符的文件)
  2. 在Jar外使用配置文件,或者使用形如application-{xxx}.properties/yaml这种配置
  3. 若在多文档yaml中使用到了spring.profiles配置项


Spring Boot 2.4.0升级对配置文件的改动是最大的,并且还不具备向下兼容性,简单的说就是从此版本开始要把Spring Boot的配置文件加载机制重学一遍(比如还增加了spring.config.import,增加了对kubernetes配置的支持等等),并且还要学会如何迁移。


为了更好的描述好这个非常非常重要的知识点,下篇文章我会用专文来全面介绍 Spring Boot这套全新的配置文件加载机制,并且辅以原理,以及和过去方式的比较,帮助你更全面、更快速、更劳的掌握它,欢迎持续关注。


说明:Spring Boot的配置文件加载机制非常非常重要,因为你也知道你平时开发中很大程度实际上是在跟它的配置项打交道。新的配置加载方式比老的更加优秀,适应发展,敬请期待


从spring-boot-starter-test中删除Vintage Engine


Spring Boot 2.2.0版本开始就引入JUnit 5作为单元测试默认库,在此之前,spring-boot-starter-test包含的是JUnit 4的依赖,Spring Boot 2.2.0版本之后替换成了Junit Jupiter(Junit5)。


Vintage Engine属于Junit5的一个模块,它的作用是:允许用JUnit 5运行用JUnit 4编写的测试,从而提供了向下兼容的能力。


从2.2.0到现在经过了2个版本的迭代,到Spring Boot 2.4.0这个版本决定了把Vintage Engine从spring-boot-starter-test正式移除。因此:若你的工程仍需要对JUnit4支持,那么请手动引入依赖项(如果工程量不大,强烈建议使用JUnit5,比4好用太多):


<dependency>
    <groupId>org.junit.vintage</groupId>
    <artifactId>junit-vintage-engine</artifactId>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>


说明:其实在2.4.0之前,若你是从https://start.spring.io生成的项目其实也是不会带有vintage-engine的。只不过它是通过显式的在pom里通过exclusion标签来排除的


嵌入式数据库检测


改进嵌入式数据库检测机制:仅当数据库在内存中时才将其视为嵌入式数据库。所以如果使用H2、HSQL等产品,但是你是基于文件的持久性或使用的是服务器模式,那么将不会检测为内存数据库。而对于非内存数据库,你可能需要额外做如下动作:


  1. sa用户名将不会再被主动设置。所以如果你的数据库需要用户名,请增加配置项:spring.datasource.username = sa
  2. 这种数据库将不会再被自动初始化,若要使用请根据需要更改spring.datasource.initialization-mode的值

相关文章
|
3月前
|
XML Java 数据格式
Spring从入门到入土(xml配置文件的基础使用方式)
本文详细介绍了Spring框架中XML配置文件的使用方法,包括读取配置文件、创建带参数的构造对象、使用工厂方法和静态方法创建对象、对象生命周期管理以及单例和多例模式的测试。
151 7
Spring从入门到入土(xml配置文件的基础使用方式)
|
5天前
|
Java 测试技术 应用服务中间件
Spring Boot 配置文件总结
Spring Boot 提供全局配置文件 `application.properties` 和 `application.yml`,用于修改自动配置的默认值。前者使用键值对配置,后者使用缩进和冒号。不同环境(开发、测试、生产)可切换配置文件,通过 `spring.profiles.active` 指定。例如,开发环境端口为4790,测试环境为4791,生产环境为4792。配置示例展示了属性、List、Map定义及引用方法。
42 14
|
27天前
|
XML Java 数据格式
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
本文介绍了在使用Spring框架时,如何通过创建`applicationContext.xml`配置文件来管理对象。首先,在resources目录下新建XML配置文件,并通过IDEA自动生成部分配置。为完善配置,特别是添加AOP支持,可以通过IDEA的Live Templates功能自定义XML模板。具体步骤包括:连续按两次Shift搜索Live Templates,配置模板内容,输入特定前缀(如spring)并按Tab键即可快速生成完整的Spring配置文件。这样可以大大提高开发效率,减少重复工作。
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
|
3月前
|
Java API Spring
在 Spring 配置文件中配置 Filter 的步骤
【10月更文挑战第21天】在 Spring 配置文件中配置 Filter 是实现请求过滤的重要手段。通过合理的配置,可以灵活地对请求进行处理,满足各种应用需求。还可以根据具体的项目要求和实际情况,进一步深入研究和优化 Filter 的配置,以提高应用的性能和安全性。
|
2月前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
64 2
|
3月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
116 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
3月前
|
Java 测试技术 Spring
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件
这篇文章介绍了Spring Boot中配置文件的语法、如何读取配置文件以及如何通过静态工具类读取配置文件。
275 0
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件
|
3月前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
100 2
|
4月前
|
消息中间件 NoSQL 安全
(转)Spring Boot加载 不同位置的 application.properties配置文件顺序规则
这篇文章介绍了Spring Boot加载配置文件的顺序规则,包括不同位置的application.properties文件的加载优先级,以及如何通过命令行参数或环境变量来指定配置文件的名称和位置。
147 0
|
8月前
|
XML 安全 Java
深入实践springboot实战 蓄势待发 我不是雷锋 我是知识搬运工
springboot,说白了就是一个集合了功能的大类库,包括springMVC,spring,spring data,spring security等等,并且提供了很多和可以和其他常用框架,插件完美整合的接口(只能说是一些常用框架,基本在github上能排上名次的都有完美整合,但如果是自己写的一个框架就无法实现快速整合)。