Springboot加载配置文件

本文主要集中测试和探讨一下 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
复制代码

调用接口,查看返回结果。

这里的运行我们并没有指定配置yml文件路径。反编译 jar 包后查看可知 yml 文件已经和所有的class文件一起打包在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包内yml文件中的属性已经被覆盖了。

如果此时不在命令行参数中指定结果会怎样,程序会加载jar外的配置文件还是jar包内部的?

执行下面的指令:

java -jar springboot-test-1.0-SNAPSHOT.jar
复制代码

运行结果:

可以看出来,结果与上面相同,即springboot会优先加载jar包外的 yml 文件,并提取其中参数配置项的值覆盖 jar包内的 yml 文件。

如果我们把jar外的yml文件删除,会怎样?

可以看到,此时的值已经成为jar包内配置的了。

但是,如果用命令行指定配置文件的路径,那么所有的配置文件路径都可以么?对此 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 配置文件。

jar 包同级目录下放置 yml 配置如上图所示。执行命令:

java -jar springboot-test-1.0-SNAPSHOT.jar 
复制代码

运行结果:

可知结果符合上面描述的优先级。

转载于:https://juejin.im/post/5cc5bf04f265da037129a7fd

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值