配置源及优先级顺序
(优先级一次从高到低)
- 用户目录下 ~/.spring-boot-devtools.properties 文件的全局配置:对机器上所有应用生效
- @TestPropertySource 是Spring的类注解,用于标注集成测试类
- @SpringBootTest 注解类用于局部应用测试
- 命令行参数
- 环境变量或系统变量嵌入的json配置:SPRING_APPLICATION_JSON
- Servlet配置中初始化参数:ServletConfig
- Servlet上下文中初始化参数:ServletContext
- 来自于java编译环境变量的JNDI 属性
- 系统变量
- 操作系统变量
- 通过RandomValuePropertySource和random.*定义的随机配置
- 包外properties和yaml的profile文件
- 包内properties和yaml的profile文件
- 包外properties和yaml文件
- 包内properties和yaml文件
- 和@Configuration联合使用的@PropertySource注解,作为Environment的一种ProperySource
- Default properties (specified by setting SpringApplication.setDefaultProperties).
yaml和properties配置文件优先级
- 实质:同级别
- 同时存在时:SpringBoot2.4.0以前,若properties存在,加载properties,不存在则加载yaml文件;SpringBoot2.4.0以后,若yaml文件存在,先加载yaml,不存在则加载properties文件;
- 一般情况:使用任意其一即可,可以理解为同一级别配置文件的两种格式
源码加载和管理原理
- Resource 理解为一个资源,一个配置路径location对应一个Resource;
- RandomValuePropertySouce 是一个优先级较高的动态随机变化的配置;
- ConfigFileApplicationListener 通过监听 ApplicationEnvironmentPreparedEvent 事务触发配置加载
- ConfigFileApplicationListener 只解决触发的问题,具体加载过程由其内部类 Loader 统一完成
- 不同格式的配置文件是由不同的 PropertySourceLoader实现类完成的
- 常用的配置文件格式 yaml 和 xml、properties 分别由YamlPropertySourceLoader和PropertiesPropertySourceLoader实现类完成
- 配置文件的加载是并发锁管理的,不会加载多次
动态配置
动态配置简单可以理解为environment 的 propertiesSource 字段中的value在运行时动态发生更新变化。有很多客户端可以实现动态配置,nacos、zookeeper、Spring Config。