spring boot外部配置文件

基础环境 :

基础环境

版本

spring boot

2.7.0

JDK

8


测试代码:

@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.properties

internal_default

spring默认的配置文件

jar包内resource目录下的application-test.properties

internal_test

spring约定俗成的拓展配置文件,需要类似spring.profiles.active的配置激活

jar包外config目录下的application.properties

out_default

springboot jar包同级目录下的config目录下,测试引用外部配置文件使用

jar包外config目录下的application-test.properties

out_test

springboot jar包同级目录下的config目录下,测试引用外部配置文件使用

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

spring项目配置文件连接两个数据库 spring config location两个配置文件_配置文件


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

spring项目配置文件连接两个数据库 spring config location两个配置文件_spring项目配置文件连接两个数据库_02

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项目配置文件连接两个数据库 spring config location两个配置文件_配置文件_03

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

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

spring项目配置文件连接两个数据库 spring config location两个配置文件_spring项目配置文件连接两个数据库_04

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

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

spring项目配置文件连接两个数据库 spring config location两个配置文件_配置文件_05


spring项目配置文件连接两个数据库 spring config location两个配置文件_spring_06

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

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