1、配置文件优先级
classpath:/application.yml
classpath:/config/application.yml
启动目录:/application.yml
启动目录:/config/application.yml
系统属性参数 如:java -Dspring.config.location=/aa/ss/cc/ -jar xxx.jar
命令行参数 如:java -jar xxx.jar --server.port=8888
springboot会从上到下依次读取,重复的字段后者覆盖前者。(也就是说下边的优先级更高,对于没有配置的属性会逐层向上查找,若都没有配置才会使用默认值)
这里只列举了部分常见配置位置,可在springboot官方文档找到详情描述
PS:启动目录是指执行java -jar xxx
命令时所在的目录,idea启动的话就是整个项目的根目录。
2、yml 还是 properties
springboot 中可以使用 application.yml 或者 application.properties 作为配置文件
两者同时存在时 application.properties 优先级更高
但也不绝对,有些springboot 版本中 yml 优先级更高,所以两者不要同时使用。
3、启动参数配置
springboot 程序可以在启动时指定配置文件的位置,也可以在启动时直接制定配置项。
配置方法有两种:
- 通过 --Xxx 命令行参数
- 命令行参数必须放在
-jar Xxx
之后,这些配置会作为 main 方法的入参,最终被传给 SpringApplication.run() 方法,由 spring 处理(优先级高于 -D 系统属性参数)
- 通过 -Dxxx 系统属性参数
- 系统属性参数,只能在 -jar 之前配置,否则无效。配置后在程序中可以通过 System.getProperty() 方法获取。
PS: --Xxx 命令行参数优先级高于 -D 系统属性参数。
关于 spring.config.location 配置
启动时可以通过 spring.config.location 指定配置文件所在的位置,--Xxx 和 -DXxx 均可。但必须是文件夹,且必须以/
结尾。否则报错 java.lang.IllegalStateException: Unable to load config data from '/ccc/aaa'
关于 spring.config.name 配置
--spring.config.name=bbb
指定配置文件名称,注意不能加文件后缀,否则配置不生效。
关于 系统环境变量
System.getenv() 获取的是系统环境变量,系统环境变量不能通过启动参数配置。但是可以通过shell脚本配置临时环境变量。如:
mac / linux 中:export aaa=xxx & java -jar xxx.jar
windows中:set aaa=xxx & java -jar xxx.jar
idea中:可以配置 Environment variables 选项实现