Spring Boot 配置的优先级

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot 配置的优先级相关的知识,希望对你有一定的参考价值。

参考技术A 本文主要参考 Externalized Configuration
为了能让应用在不同的环境下运行,Spring Boot允许自定义配置文件,如properties文件、yaml文件、系统环境变量参数、命令行参数。配置文件的覆盖优先级如下

Developer Tools 提供了一些开发帮助工具,在build.gradle添加依赖后启用。

Spring Boot会读取在计算机用户的home目录下的 .spring-boot-devtools.properties 文件里的配置参数到该计算级的所有Spring Boot应用中作为顶层配置,如Linux环境下root用户下 ~/.spring-boot-devtools.properties 文件。开发过程中,可以将一些个人参数记录在这个配置文件中,例如ip地址,机器uuid,datasource参数等。在该配置文件中的定义的配置环境并不会影响到应用配置的读取,官方原话是:

但要注意,该配置优先级最高,设置的时候需要做好记录否则会出现"原因不明的bug",不过应该很少人会用到这个功能。分析下源码,就是加了一个配置切面,并把其设置为顶层配置:

在测试的时候,可能会使用另一套测试专用的配置,该套配置的优先级高于系统环境变量、java系统参数、程序内部参数, @TestPropertySource 注解就是用来指定这一类配置的。该注解一共有5个参数可以设置:

如果使用注解的时候没有任何参数,那么会从标注了注解的测试类的包中尝试读取配置文件,例如测试类 com.spring.test.DemoTest ,那么相应的默认配置文件为 com.spring.test.DemoTest.properties ,如果没有找到默认的配置文件则抛出非法状态异常。
AbstractTestContextBootstrapper 在初始化上下文的时候会调用一个读取、合并配置的方法 buildMergedContextConfiguration ,该方法通过工具类 TestPropertySourceUtils 读取类的注解信息。 TestPropertySourceUtils 从类的注解解析配置信息后返回一个可合并的配置源。

@SpringBootTest 的value\properties属性用于注入一些自定义的注解,语法要求和 @TestPropertySource 的properties一样,这里就不详细展开了。

用命令行方式启动Spring Boot应用程序的时候,可以注入一些配置参数,参数的格式是 --key=name 。举个简单的例子,程序直接输出一个参数,然后打成jar包后运行。

运行:
java -jar .\springbootconfiguraiton.jar --cl.name="Spring Boot Arguments"
从输出的结果中可以看到可以读取到命令行中的配置。

可以在环境变量中定义一个key为SPRING_APPLICATION_JSON的参数,值为json字符串,Spring Boot会解析该json字符串作为参数注入到系统中。SPRING_APPLICATION_JSON可以定义在环境变量、系统配置中,命令行也是可以的,例如命令行参数中用到的demo,执行以下的命令也应该能得到相同的参数结果。
java -jar .\springbootconfiguraiton.jar SPRING_APPLICATION_JSON='"cl":"name"="Spring Boot Arguments"'
结果输出是undefined,不知道原因,这个配置方式用的应该也很少,放弃研究。。。

优先级是 ServletConfig > ServletContext ,可以在application.yml中设置:

随机数配置大多用于测试,支持的类型如下:

其中long\int可以限制数据范围,[]是闭区间,()是开区间。

这个应该是我们用的最多的。首先说优先级,文件可以放在以下4个位置,相同文件从上到下覆盖。外部指的是启动应用程序的目录,例如gradle用application插件打包后,运行的脚本目录就是 ./ :

文件的命名为 application-[当前激活的环境名].[yml/properties] ,当前激活的配置可以用 spring.profile.active=[当前激活的环境名] 定义,多个环境名用逗号分隔,未设置时用 default 标识。关于如果修改默认的加载路径和文件名,后面会继续讨论。

Spring Boot系统启动时默认会读取的配置文件,支持properties\yml格式。也就是说,会先加载 application.properties ,根据 spring.profile.active 的设置加载相应的 application-XX.properties 配置,然后按优先级合并配置文件。
不同文件目录下application.properties的优先级和 自定义配置文件 的顺序是一样的。

类似 @TestPropertySource注解 ,在项目中可以方便的注入自定义的配置文件,注解一共有5个参数:

以上是关于Spring Boot 配置的优先级的主要内容,如果未能解决你的问题,请参考以下文章

spring boot自动配置

Spring Boot 配置优先级顺序

Spring Boot 配置优先级顺序

Spring Boot - ConfigDataEnvironmentPostProcessor(Boot 2.4)搞定配置文件加载优先级

Spring Boot - ConfigDataEnvironmentPostProcessor(Boot 2.4)搞定配置文件加载优先级

Spring Boot自动配置的原理简介以及配置文件的优先级