springboot读取配置文件的顺序

Spring Boot启动会扫描以下位置的application.properties或者application.yml文件作为Spring Boot的默认配置文件

外部配置的加载顺序官网 说明

SpringApplication loads properties from application.properties files in the following locations and adds them to the Spring Environment:

  1. /config subdirectory of the current directory

  2. The current directory

  3. A classpath /config package

  4. The classpath root

The list is ordered by precedence (properties defined in locations higher in the list override those defined in lower locations).

读取位置就是:

  1. file:/config/
  2. file:/
  3. classpath:/config/
  4. classpath:/

以上顺序按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级的配置内容会覆盖低优先级配置的内容,其中配置文件中的内容是互补配置,即

存在相同的配置内容,高优先级的内容会覆盖低优先级的内容存在不同的内容的时候,高优先级和低优先级的配置内容取并集我们也可以通过spring.config.location来改变默认的配置,具体做法就是项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置,指定配置文件和默认加载的配置文件共同起作用称为互补配置

java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=D:/application.properties

外部配置的加载顺序

命令行参数命令行参数的优先级是最高的,假定内部配置的最高优先级配置文件配置的启动端口号是8081,启动命令行参数如以下设置:

java -jar spring-boot-02-config-02.0.0.1-SNAPSHOT.jar --server.port=8089

那么启动的端口就改成了8089,命令行可以把项目的所有的配置选项全部都改掉

Spring Boot也可以从以下位置加载配置: 优先级从高到低顺序,高优先级覆盖低优先级,如有不同内容,高优先级和低优先级形成互补配置

  1. 来自java:comp/env的JNDI属性
  2. java系统属性(System.getProperties())
  3. 操作系统环境变量
  4. RandomValuePropertySource配置的random.*属性值
  5. jar包外部的application-{profile}.properties或者application.yml(带spring.profile)配置文件
  6. jar包内部的application-{profile}.properties或者application.yml(带spring.profile)配置文件
  7. jar包外部的application.properties或者application.yml(不带spring.profile)配置文件
  8. jar包内部的application.properties或者application.yml(不带spring.profile)配置文件
  9. @Configuration注解类上的@PropertySource
  10. 通过SpringApplication.setDefaultProperties指定的默认属性

其它

搭建springcloud项目,抽出了个公共的common模块,其他服务依赖于common模块。

我搭springboot项目一般习惯分application.ymlapplication-dev.ymlapplication-prod.yml三个配置文件,application.yml为主配置文件,通过spring.profiles.active属性指定其他配置文件,开发时指定为dev环境,线上指定为prod,方便切换。

问题

由于我将数据库信息配置在了common模块,同样的建立了这三个配置文件。现在需要开发用户user模块,引入了common模块,发现不会读取common模块的这三个配置文件,连不上数据库。

原因

springboot如果自己有application.yml,就会覆盖依赖模块的同名配置文件。spring.profiles.active也是,先到自身resource目录下找,如果找不到再去依赖模块找。

例如我在user模块建了application.yml,common模块的application.yml就不会读取。

在user模块application.yml配置了spring.profiles.active: dev,但因为user模块本身也有application-dev.yml这个文件,所以不会再去读取common的application-dev.yml配置。

方法1

将common模块的配置文件名称改掉,例如改成application-common.yml,然后在user模块用spring.profiles.active: dev,common同时引入。

因为user模块没有application-common.yml,就会去common模块找。

缺点:这种方法如果不小心起重名了,则会整个覆盖,而不是作为补充。并且在切换线上线下环境时也不方便。

方法2

在common模块的resource文件夹下创建个config文件夹,把配置文件移入。官方文档也是推荐这种方法。

这种方法若user模块和common模块的配置文件同时存在,会优先用user模块的配置,common模块的配置会作为补充

原文地址:https://www.cnblogs.com/grasp/p/15081268.html