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约定俗成的拓展配置文件,需要类似 |
jar包外config目录下的application.properties | out_default | springboot jar包同级目录下的config目录下,测试引用外部配置文件使用 |
jar包外config目录下的application-test.properties | out_test | springboot jar包同级目录下的config目录下,测试引用外部配置文件使用 |
jar包与外部配置文件目录如下图 :
config目录内配置文件如下图 :
spring.config.location
与spring.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项目项目不一定是外部优先(具体会在下面章节详解)。