spring boot 外部配置文件1-spring.config.location与spring.config.additional-location的区别

Posted keep-go-on

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring boot 外部配置文件1-spring.config.location与spring.config.additional-location的区别相关的知识,希望对你有一定的参考价值。

spring boot外部配置文件

基础环境 :

基础环境版本
spring boot2.7.0
JDK8

测试代码:

@SpringBootApplication
public class DemoApplication 
	@Value("$app.name:keepgoon")
	private String name;

	public static void main(String[] args) 
		SpringApplication.run(DemoApplication.class, args);
	
	@PostConstruct
	private void printName()
		System.out.println("配置文件读取应用名称  :  "+name);
	

内容很简单,读取 app.name 配置的值并且当配置不存在时给出一个默认值keepgoon,在spring 启动时打印出来。

配置数据描述 :

配置数据来源配置值详解
默认配置keepgoon所有的配置文件都没有这个配置时取值
jar包内resource目录下的application.propertiesinternal_defaultspring默认的配置文件
jar包内resource目录下的application-test.propertiesinternal_testspring约定俗成的拓展配置文件,需要类似spring.profiles.active的配置激活
jar包外config目录下的application.propertiesout_defaultspringboot jar包同级目录下的config目录下,测试引用外部配置文件使用
jar包外config目录下的application-test.propertiesout_testspringboot jar包同级目录下的config目录下,测试引用外部配置文件使用

jar包与外部配置文件目录如下图 :

config目录内配置文件如下图 :

spring.config.locationspring.config.additional-location 的区别

相同点是spring.config.location 配置和spring.config.additional-location都可以读取外部的配置文件。

spring.config.location 则springboot不会再读取jar包内的配置文件(也就是说resource目录下的spring配置文件全部失效),

spring.config.additional-location则会进行覆盖(这里覆盖不一定就是外部配置文件覆盖内部配置文件),例如 :如果此时内部配置文件没有配置app.name 而外部配置文件配置了则会读取外部配置文件

测试实例如下

使用spring.config.location读取外部配置文件

java -jar demo-0.0.1-SNAPSHOT.jar --spring.config.location=./config/

使用spring.config.additional-location读取外部配置文件

java -jar demo-0.0.1-SNAPSHOT.jar --spring.config.additional-location=./config/

这里可以看出两种方式读取的配置文件结果是一致的,原因是我们在config目录的application.properties 文件中配置了app.name=out_default
接下来我们删除掉jar包目录下application.properties 文件中的app.name配置了。

以此执行上面的命令 结果如下图 :

可以看出spring.config.location 由于config目录下的配置文件中已经没有了app.name配置,这时springboot也不会读取jar包内部的配置文件,而是未能读取到配置文件,打印了 keepgoon (打印这个名字说明没有读取到配置文件取了默认值)。

spring.config.additional-location引用外部配置则打印了jar包内的application.properties 配置文件的值internal_default,原因是这个配置是对内部配置的拓展,如果内部配置有,外部配置没有则读取使用内部的,如果外部有默认使用外部的(这里默认是指没有其他配置项干扰的情况下),但是这里对于复杂配置的spring boot项目项目不一定是外部优先(具体会在下面章节详解)。

以上是关于spring boot 外部配置文件1-spring.config.location与spring.config.additional-location的区别的主要内容,如果未能解决你的问题,请参考以下文章

spring boot 外部配置文件1

Spring Boot 中的外部化配置

Spring boot加载外部配置文件-EnvironmentPostProcessor

Spring boot加载外部配置文件-EnvironmentPostProcessor

单体Spring boot引入外部配置文件yml,properties

Spring Boot配置文件放在jar外部