关于spring:Spring-Boot-分离配置文件的-N-种方式

2次阅读

共计 2587 个字符,预计需要花费 7 分钟才能阅读完成。

明天聊一个小伙伴在星球上的发问:

问题不难,解决方案也有很多,因而我决定撸一篇文章和大家认真说说这个问题。

1. 配置文件地位

首先小伙伴们要明确,Spring Boot 默认加载的配置文件是 application.properties 或者 application.yaml,默认的加载地位一共有五个,五个地位能够分为两类:

从 classpath 下加载 ,这个又细分为两种:

  1. 间接读取 classpath 下的配置文件,对应到 Spring Boot 我的项目中,就是 resources 目录下的配置。
  2. 读取 classpath:/config/ 目录下的文件,对应到 Spring Boot 我的项目中就是 resources/config 目录下的配置。

这两种状况如下图:

从我的项目所在的当前目录下加载 ,这个又细分为三种状况:

  1. 从我的项目当前目录下加载配置文件。
  2. 从我的项目当前目录下的 config 文件夹中加载配置文件。
  3. 从我的项目当前目录下的 config 文件夹的子文件夹中加载(孙子文件夹不能够)。

这三种状况如下图:

config 目录下的配置文件能够被加载,config/a 目录下的配置文件也能够被加载,然而 config/a/b 目录下的配置文件不会被加载,因为不是间接子文件夹。

配置文件能够放在这么多不同的地位,如果同一个属性在多个配置文件中都写了,那么前面加载的配置会笼罩掉后面的。例如在 classpath:application.yaml 中设置我的项目端口号是 8080,在 我的项目当前目录 /config/a/application.yaml 中设置我的项目端口是 8081,那么最终的我的项目端口号就是 8081。

这是默认的文件地位。

如果你不想让本人的配置文件叫 application.properties 或者 application.yaml,那么也能够自定义配置文件名称,只须要在我的项目启动的时候指定配置文件名即可,例如我想设置我的配置文件名为 app.yaml,那么咱们能够在启动 jar 包的时候依照如下形式配置,此时零碎会主动去下面提到的五个地位查找对应的配置文件:

java -jar boot_config_file-0.0.1-SNAPSHOT.jar --spring.config.name=app

如果我的项目曾经打成 jar 包启动了,那么后面所说的目录中,后三个中的我的项目当前目录就是指 jar 包所在的目录。

如果你不想去这五个地位查找,那么也能够在启动 jar 包的时候明确指定配置文件的地位和名称,如下:

java -jar boot_config_file-0.0.1-SNAPSHOT.jar --spring.config.location=optional:classpath:/app.yaml

留神,我在 classpath 后面加上了 optional: 示意如果这个配置文件不存在,则依照默认的形式启动,而不会报错说找不到这个配置文件。如果不加这个前缀,那么当零碎找不到指定的配置文件时,就会抛出 ConfigDataLocationNotFoundException 异样,进而导致利用启动失败。

如果配置文件和 jar 包在雷同的目录构造下,如下图:

那么启动脚本如下:

java -jar boot_config_file-0.0.1-SNAPSHOT.jar --spring.config.location=optional:javaboy/app.yaml

如果 spring.config.location 的配置,只是指定了目录,那么必须以 / 结尾,例如下面这个启动脚本,也能够依照如下形式启动:

java -jar boot_config_file-0.0.1-SNAPSHOT.jar --spring.config.location=optional:javaboy/ --spring.config.name=app

通过 spring.config.location 属性锁定配置文件的地位,通过 spring.config.name 属性锁定配置文件的文件名。

2. 额定地位

后面咱们对于配置文件地位的设置,都是笼罩掉已有的配置,如果不想笼罩掉 Spring Boot 默认的配置文件查找策略,又想退出本人的,那么能够依照如下形式指定配置文件地位:

java -jar boot_config_file-0.0.1-SNAPSHOT.jar --spring.config.additional-location=optional:javaboy/app.yaml

如果这个额定指定的配置文件和已有的配置文件有抵触,那么还是以后来者为准。

3. 地位通配符

有一种状况,假如我有 redis 和 mysql 的配置,我想将之放在两个不同的文件夹中以便于管理,像上面这样:

那么在我的项目启动时,能够通过通配符 * 批量扫描相应的文件夹:

java -jar boot_config_file-0.0.1-SNAPSHOT.jar --spring.config.location=optional:config/*/

应用通配符批量扫描 mysql 和 redis 目录时,默认的加载程序是依照文件夹的字母排序,即先加载 mysql 目录后加载 redis 目录。

须要留神的是,通配符只能用在内部目录中,不能够用在 classpath 中的目录上。另外,蕴含了通配符的目录,只能有一个通配符 *,不能够有多个,并且还必须是以 */ 结尾,即一个目录的最初局部能够不确定。

4. 导入内部配置

从 Spring Boot2.4 开始,咱们也能够应用 spring.config.import 办法来导入配置文件,相比于 additional-location 配置,这个 import 导入更加灵便,能够导入任意名称的配置文件。

spring.config.import=optional:file:./dev.properties

甚至,这个 spring.config.import 还能够导入无扩展名的配置文件,例如我有一个配置文件,是 properties 格局的,然而这个这个配置文件没有扩展名,当初我想将之作为 properties 格局的配置文件导入,形式如下:

spring.config.import=optional:file:/Users/sang/dev[.properties]

好啦,看完下面的内容,文章一开始的问题答案就不必我多说了吧~

正文完
 0