一、简介

前言:

Spring这么流星很重要的一个思想是:配置化思想。从而达到解耦的目的,很多都不需要硬编码,配置一下即可完成,可谓大大提高了编码的效率。

Spring支持的配置文件加载的方式繁多,一方面是扩大了灵活性,另一方面其实也带来了较大的复杂性。因此本文旨在用一篇文章解决读者朋友的烦恼,同时有时候也是你我的烦恼。

我们知道SpringBoot支持三种配置文件:

application*.yml  
application*.yaml   
application*.properties 

示例:

在 Resources 文件夹下新建 application.yml 和 application.properties 文件。

application.properties:

server.port=8001

application.yml :

server:
  port: 7001

运行程序:

SpringBoot内外部配置文件加载和优先级_spring

通过运行结果,我们可以得出:

这三种配置文件以 application*.properties 优先级最高application.properties 和 yml 文件在并存时(同一目录下)

application.properties 优先级更好,会先读它,若它没有,再去读yml中的值。

下面所有的Demo代码都以 yml 进行演示 

二、内部的配置文件加载

 内部配置文件的加载都有哪些目录呢?

我们在IDE编辑器中找到类 ConfigFileApplicationListener 打开,发现默认扫描目录是四个:

SpringBoot内外部配置文件加载和优先级_配置文件_02

 对应的四个目录:

path   扫描优先级
 ./  项目根目录下的config目录 2
 ./config 项目根目录下的config目录  1
 classPath:./ 编译路径下的根目录  4
 classPath:/config 编译路径下的config目录  3

 

 

 

 

项目启动后扫描顺序:

    1. 先去项目根目录找config文件夹下找配置文件件
    2. 再去根目录下找配置文件
    3. resources下找cofnig文件夹下找配置文件
    4. resources下找配置文件

 以上四个目录,SpringBoot 启动时会按照优先级从低到高的顺序,所有的配置文件都会被加载,高优先级的配置文件会覆盖低优先级的配置文件内容。

SpringBoot 会按照四个位置全部加载配置文件,如果高优先级的配置文件属性和低优先级的配置文件属性不冲突,则会共存互补。  

按照上面的目录,我们在项目中分别建立对应的文件夹和文件夹下的文件,配置文件的优先级为:

SpringBoot内外部配置文件加载和优先级_经验分享_03

备注:

这里说的配置文件,都还是项目里面。最终都会被打进jar包里面的,需要注意。

1、如果同一个目录下,有 application.yml 也有 application.properties,默认先读取 application.properties。
2、如果同一个配置属性,在多个配置文件都配置了,默认使用第1个读取到的,后面读取的不覆盖前面读取到的。
3、创建SpringBoot项目时,一般的配置文件放置在“项目的resources目录下”

 

三、外部的配置文件加载

有的时候,配置信息是我们无法在开发过程中就能确定的。比如,给客户开发的项目,客户需要根据自身的情况自定义配置,如数据库配置,加密密钥配置等等。

这时候,就需要把配置文件放在外面,让用户自定义配置部署了。

SpringBoot  打包时不会把 ./config  ./这两级的目录打包进去。这个设计很巧妙,因为没有打包进来,所以SpringBoot可以加载外部发配置文件。

SpringBoot 支持把配置文件放在外部。只要把配置文件放在jar包的同级目录下,或者放在同级下的config文件夹中,SpringBoot都会去此处读取配置文件。

1、现在有一个SpringBoot 打包程序,(有一个配置文件 application.yml 在默认的 Resources 文件夹下):

 application.yml 配置信息:

server:
  port: 8001

执行命令  java -jar springboot-0.0.1-SNAPSHOT.jar  ,程序启动以后,我们可以看到启动端口是我们配置的 8001:

SpringBoot内外部配置文件加载和优先级_经验分享_04

 2、这时,我们在根目录添加配置文件 application.properties

server.port=8002

SpringBoot内外部配置文件加载和优先级_配置文件_05

执行命令  java -jar springboot-0.0.1-SNAPSHOT.jar  ,程序启动后,启动端口为 application.properties 配置文件内配置的 8002 端口

SpringBoot内外部配置文件加载和优先级_经验分享_06

3、这时,我们在根目录添加文件夹和配置文件 ./config/application.properties

SpringBoot内外部配置文件加载和优先级_jar_07

server.port=8003

执行命令  java -jar springboot-0.0.1-SNAPSHOT.jar  ,程序启动后,我们发现启动端口为根目录 config文件夹下 application.properties 配置文件内配置的 8003 端口

 SpringBoot内外部配置文件加载和优先级_经验分享_08

 这样每次修改的时候只需要修改配置文件信息,然后重启项目就好,不需要重新打包。如果想要只修改配置文件,不重启项目就能生效,可以考虑用java来读取配置文件中的数据。

四、命令行配置方式

比如  java -jar 这种方式,多个属性之间用空格分开,properties 里的属性基本都能用,用法是属性项=属性值这种方法,举个例子:

java -jar springboot-0.0.1-SNAPSHOT.jar --server.port=8002 --server.context-path=/example

上面的命令行进行了两个配置  server.port 和 server.context-path。可以根据需要进行配置。

如果我们外部的配置文件不想放在默认的位置可使用 --spring.config.location 命令指定配置文件的目录

在根目录新建 test 文件夹,把 application.properties 配置文件放入其中:

SpringBoot内外部配置文件加载和优先级_spring_09

test文件夹内  application.properties 配置文件内容:

server.port=8006

执行 下面命令行,启动项目:

java -jar springboot-0.0.1-SNAPSHOT.jar --spring.config.location=./test/application.properties

项目启动后,可以看到端口后是 test 文件夹中 application.properties 配置文件中配置的端口,配置生效。

SpringBoot内外部配置文件加载和优先级_根目录_10