Spring Boot 配置文件
一.properties 和yml 配置文件
-
同路径下优先级 properties > yml, properties会有中文乱码的情况
-
针对同数据结构之间的表示方式不同
-
例子:
properties:
# 普通数据 person.name=yu person.age=11 # map person.map.k1=v1 person.map.k2=v2 person.list=1,2,3
-
yml
person: name: yu age: 11 map: k1: v1 k2: v2 map1: {k1: v1,k2: v2} list: [1,2,3]
-
针对java对象实例,引用配置文件的数据
@Component @ConfigurationProperties(prefix = "person") @Data @ToString public class Person { @Value("${person.age}") private String name; private Integer age; private Map<String,String> map; private List<Object> list; } 输出结果: Person(name=yu, age=11, map={k1=v1, k2=v2}, list=[1, 2, 3])
使用 @ConfigurationProperties(prefix = “person”) 获取配置文件中指定前缀的数据
使用@value("${}")可以获取指定的数据,下面的例子可以看出来
@ConfigurationProperties > @value
@value 对复杂的数据结构不支持
@Value("#{'${mail.smtp.aoshengLive.receiver}'.split(',')}") 可以按照指定分割符list List<String> tos;
-
二. 引用配置文件数据
1.@ConfigurationProperties 和 @value
- 使用 @ConfigurationProperties(prefix = “person”) 获取配置文件中指定前缀的数据
- 使用@value("${}")可以获取指定的数据,下面的例子可以看出来
- @ConfigurationProperties > @value
- @value 对复杂的数据结构不支持
2.@propertySource 获取指定配置文件的数据
- properties:
person.name=haha
person.age=11
- java:
@Component
@ConfigurationProperties(prefix = "person")
@PropertySource(value = {"classpath:person.properties"})
@Data
@ToString
public class Person {
private String name;
private Integer age;
private Map<String,String> map;
private List<Object> list;
}
输出结果: Person(name=haha, age=11, map=null, list=null)
3. 配置文件占位符
可以使用 ${} 占位符使用数据,可以使用配置文件的其他数据
-
properties
person.name=${person.age}鱼${random.int(10)} 随机数计算 person.age=11
-
java
@Service("person") @ConfigurationProperties(prefix = "person") @Data @ToString public class Person { private String name; private Integer age; private Map<String,String> map; private List<Object> list; } 结果为: Person(name=11鱼7, age=11)
三. 多profiles 配置
application-{profile}.properties /yml
激活 dev:
- 主配置文件中指定 :spring.profiles.active=dev
- 使用命令行 java -jar springboot.jar --spring.profiles.active=dev
- vm参数:-Dspring.profiles.active=dev
四. 配置文件的加载优先级
-
file:./config
-
file:./
-
classpath:/config/
-
classpath:/
优先级从高到低,高优先级配置覆盖低优先级
五.外部配置加载顺序
SpringBoot也可以从以下位置加载配置; 优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置
1.命令行参数
所有的配置都可以在命令行上进行指定
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc
多个配置用空格分开; --配置项=值
2.来自java:comp/env的JNDI属性
3.Java系统属性(System.getProperties())
4.操作系统环境变量
5.RandomValuePropertySource配置的random.*属性值
由jar包外向jar包内进行寻找;
优先加载带profile
6.jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
7.jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
再来加载不带profile
8.jar包外部的application.properties或application.yml(不带spring.profile)配置文件
9.jar包内部的application.properties或application.yml(不带spring.profile)配置文件
10.@Configuration注解类上的@PropertySource
11.通过SpringApplication.setDefaultProperties指定的默认属性
所有支持的配置加载来源;