【Spring】配置文件优先级
1、Q:在 Spring Boot 中,Java 程序读取配置的优先级是怎么样的?
命令行参数:最高优先级,直接覆盖其他配置。java -jar your-app.jar --spring.config.name=custom-config
SPRING_APPLICATION_JSON
环境变量内容。application.properties
或application.yml
位于config
目录下。application.properties
或application.yml
在当前目录下。类路径下的
config
包中的application.properties
或application.yml
。类路径根目录下的
application.properties
或application.yml
。@PropertySource
注解的配置文件。默认属性:由
SpringApplication.setDefaultProperties
指定。
2、总结:
1、优先级:命令行>操作系统环境变量>配置中心>配置文件-{active}>配置文件.properties>配置文件.yml
2、如果 Jar 包内外存在同名文件,Jar 包外文件优先
3、Springboot 服务启动时会按优先级搜寻所有的配置文件,但不是搜寻到就停止搜寻了;这意味着:所有配置文件中的属性配置都会被 Springboot 服务读取并使用到;且当这些配置文件中具有相同属性配置时,优先级高的配置文件中的属性配置会覆盖优先级低的。
参考:https://docs.spring.io/spring-boot/reference/features/external-config.html
3、最佳实践
```
# 数据库配置
-Dspring.datasource.url=jdbc:mysql://localhost:3306/db
# JVM 参数
-Xms512m -Xmx1024m -XX:MaxPermSize=256m
# 应用参数
--server.port=8080 --spring.profiles.active=dev# 日志级别--logging.level.root=INFO
# 配置文件位置
--spring.config.location=classpath:/custom-config/
```
同时使用-D 和--参数时
```
java -Dserver.port=8080 -jar app.jar --server.port=9090
最终生效的是 --server.port=9090
因为命令行参数(--)优先级高于系统属性(-D)
java -jar app.jar --debug
```
查看特定配置
```
--trace
--logging.level.org.springframework=DEBUG
```
附录:明细 from Spring Doc
```
命令行参数 --spring.config.location 指定的配置文件
命令行参数 -D 指定的系统属性
命令行参数 -- 指定的应用参数
@TestPropertySource 注解
@SpringBootTest 注解的 properties 属性
环境变量 SPRING_APPLICATION_JSON
ServletConfig 初始化参数
ServletContext 初始化参数
JNDI 属性
Java 系统属性 System.getProperties()
操作系统环境变量
random.* 属性
jar 包外部的 application-{profile}.properties/yml
jar 包内部的 application-{profile}.properties/yml
jar 包外部的 application.properties/yml
jar 包内部的 application.properties/yml
```
评论