本文主要集中测试和探讨一下 SpringBoot 的配置文件加载机制。
一个简单的SpringBoot工程,工程目录结构如下:
实现功能:
通过访问 "/person" 这个接口,返回 PersonConfig 配置对象中的name和age属性。
resource目录下的 yml 文件配置如下:
先将其打成 jar 包执行。
这里要说一下给Springboot工程打jar包的方法。
只需要简单地,在pom文件中的build属性添加下面的配置项即可,无需自己再添加 shade 或者 assembly 指定 mainClass 打包(关于这个实现机制,在后面的文章会集中探讨。)。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.4.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
复制代码
执行命令,运行该 jar 包。
java -jar springboot-test-1.0-SNAPSHOT.jar
复制代码
调用接口,查看返回结果。
但是在生产环境中,我们往往需要的是实现可配置。这时候我们可以使用 springboot 提供的一个叫 Externalized Configuration 机制。
参考 springboot 官方文档相关说明如下:
Spring Boot lets you externalize your configuration so that you can work with the same application code in different environments. You can use properties files, YAML files, environment variables, and command-line arguments to externalize configuration. Property values can be injected directly into your beans by using the @Value annotation, accessed through Spring’s Environment abstraction, or be bound to structured objects through @ConfigurationProperties.
这段话主要提到了 springboot 的四种配置机制:property 文件,yml 文件,环境变量,命令行。其实细看后面的说明,文档中提到了 17 种配置方式,但是鉴于常用的的方式主要有这四种,所以以下就这四种机制进行探讨。
YAML 文件配置方式
jar包同级的 yaml 文件
我们在jar包同级目录下放置 yml 配置文件,配置项如下所示:
通过命令行参数指定yml文件路径,执行如下所示的命令:
java -jar springboot-test-1.0-SNAPSHOT.jar
--spring.config.location=file:./application.yml
复制代码
运行结果:
如果此时不在命令行参数中指定结果会怎样,程序会加载jar外的配置文件还是jar包内部的?
执行下面的指令:
java -jar springboot-test-1.0-SNAPSHOT.jar
复制代码
运行结果:
可以看出来,结果与上面相同,即springboot会优先加载jar包外的 yml 文件,并提取其中参数配置项的值覆盖 jar包内的 yml 文件。
如果我们把jar外的yml文件删除,会怎样?
但是,如果用命令行指定配置文件的路径,那么所有的配置文件路径都可以么?对此 springboot 是有规范的。
下面我们把 yml 文件放到一个叫 other 的文件夹下,并通过命令行参数指定文件路径运行。
java -jar springboot-test-1.0-SNAPSHOT.jar
--spring.config.location=file:./other/application.yml
复制代码
此时的运行结果:
而且这些路径之间的优先级如下:
1.file:./config/
2.file:./
3.classpath:/config/
4.classpath:/
复制代码
springboot 扫描配置文件的顺序从1到4。只要扫描到了配置文件,则不再继续扫描。
现在我们在 config 目录下和 jar 包同级根目录下同时放置 yml 配置文件。
java -jar springboot-test-1.0-SNAPSHOT.jar
复制代码
运行结果: