1. 配置优先级
Spring Boot 允许将配置外部化,以便可以在不同的环境中使用相同的应用程序代码。
我们可以使用各种外部配置源,包括Java Properties文件、YAML文件、环境变量和命令行参数。
@Value可以获取值,也可以用@ConfigurationProperties将所有属性绑定到java object中
以下是 SpringBoot 属性源加载顺序。后面的会覆盖前面的值。由低到高,高优先级配置覆盖低优先级
- 默认属性(通过SpringApplication.setDefaultProperties指定的)
- @PropertySource指定加载的配置(需要写在@Configuration类上才可生效)
- 配置文件(application.properties/yml等)
- RandomValuePropertySource支持的random.*配置(如:@Value("${random.int}"))
- OS 环境变量
- Java 系统属性(System.getProperties())
- JNDI 属性(来自java:comp/env)
- ServletContext 初始化参数
- ServletConfig 初始化参数
- SPRING_APPLICATION_JSON属性(内置在环境变量或系统属性中的 JSON)
- 命令行参数
- 测试属性。(@SpringBootTest进行测试时指定的属性)
- 测试类@TestPropertySource注解
- Devtools 设置的全局属性。($HOME/.config/spring-boot)
结论:配置可以写到很多位置,常见的优先级顺序:
● 命令行 > 配置文件 > springapplication配置
配置文件优先级如下:(后面覆盖前面)
- jar 包内的application.properties/yml
- jar 包内的application-{profile}.properties/yml
- jar 包外的application.properties/yml
- jar 包外的application-{profile}.properties/yml
建议:用一种格式的配置文件。如果.properties和.yml同时存在,则.properties优先
结论:包外 > 包内; 同级情况:profile配置 > application配置
所有参数均可由命令行传入,使用--参数项=参数值,将会被添加到环境变量中,并优先于配置文件。
比如java -jar app.jar --name="Spring",可以使用@Value("${name}")获取
演示场景:
●包内: application.properties server.port=8000
●包内: application-dev.properties server.port=9000
●包外: application.properties server.port=8001
●包外: application-dev.properties server.port=9001
启动端口?:命令行 > 9001 > 8001 > 9000 > 8000
2. 外部配置
SpringBoot 应用启动时会自动寻找application.properties和application.yaml位置,进行加载。顺序如下:(后面覆盖前面)
- 类路径: 内部
a 类根路径
b 类下/config包 - 当前路径(项目所在的位置)
a 当前路径
b 当前下/config子目录
c /config目录的直接子目录
最终效果:优先级由高到低,前面覆盖后面
●命令行 > 包外config直接子目录 > 包外config目录 > 包外根目录 > 包内目录
●同级比较:
○profile配置 > 默认配置
○properties配置 > yaml配置
规律:最外层的最优先。
●命令行 > 所有
●包外 > 包内
●config目录 > 根目录
●profile > application
配置不同就都生效(互补),配置相同高优先级覆盖低优先级
3.导入配置
使用spring.config.import可以导入额外配置
无论以上写法的先后顺序,my.properties的值总是优先于直接在文件中编写的my.property。
4.属性占位符
配置文件中可以使用 ${name:default}形式取出之前配置过的值。
注:参考自雷丰阳老师笔记
Comments | NOTHING