SpringBoot使用一个全局的配置文件,作用是修改项目的默认值,配置文件名是固定的;application.properties/application.yml
一、yml
yml是以数据为中心的文件,比xml、json更适合做配置文件,不是标记语言。
1.语法
- 【key: value】表示键值对关系,冒号后面必须有一个空格;
- 使用空格的缩进表示层级关系,空格数目不重要,只要是左对齐的一列数据,都是同一个层级的,不允许【Tab】来缩进,只能用【空格】;
- 区分大小写;
- 松散表示,java中对于驼峰命名法,可用原名或使用-代替驼峰,如java中的lastName属性,在yml中使用lastName或 last-name都可正确映射;
- 只能单行注释#
2.赋值
(1)字面量:字符串默认不用加引号,加双引号特殊字符不会转义,加单引号会转义
(2)日期:value以【/】分开,例如2020/06/21
(3)数组:list和set中用【-】表示其中一个元素
(4)行内写法:下一级用花括号{}围起来,每个【key: value】之间用【,】隔开
(5)POJO类注入:
加上@Component注解表示是Spring组件,映射
加上@ConfigurationProperties告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定,需要在pom.xml里加上依赖包spring-boot-configuration-processor(配置文件处理器)。需要用前缀(prefix = "person")指定全局配置文件下的person下层的属性进行赋值,删掉后不能成功赋值。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
对于该Person类与对应的yml配置文件
@Component @ConfigurationProperties(prefix = "person")
@Data public class Person { private String lastName; private Integer age; private Boolean boss; private Date birth; private Map<String,Object> maps; private List<Object> lists; private Dog dog; }
application.yml文件
person:
last-name: 守林鸟
age: 22
boss: false
birth: 1998/11/02
maps: {country: 中国,city: 广州}
lists:
- 乒乓
- 羽毛
- 骑行
dog:
name: 二哈
age: 3
#这是注释
在测试类里测试输出
import com.lyj.demo.bean.Person; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.junit.jupiter.api.Test; @SpringBootTest class Test01ApplicationTests { @Autowired Person person; @Test public void testHello(){ System.out.println(person); } }
在实际开发中,数据基本都是从web层传入,而不是在配置文件中写死,配置文件一般用于连接数据库等可以写死的信息,这里只是记录注入的语法规范。
二、properties
这是一种属性文件,也是以key-value的形式存值
(1)注释#
(2)赋值以【.】的形式,也需要在Person类上面加上@ConfigurationProperties(prefix = "person")
#单行注释
person.last-name=霸王别鸡
person.age=23
person.boss=false
person.birth=1998/11/02
person.maps.country=中国
person.maps.city=广州
person.lists[0]=乒乓
person.lists[1]=羽毛
person.lists[2]=打码
person.dog.name=二哈
person.dog.age=3 #后续要比对
(3)idea乱码问题
File->Settings...->Editor->File Encodings,默认编码格式改为UTF-8,勾选后面的【Transparent native-to-ascii conversion】。
(4)与yml一起加载
如果两个配置文件同时存在,先加载yml文件,再加载properties文件,二者都有的属性yml的会被覆盖,如果仅yml有的属性就不会被覆盖,可以理解为properties优先级更高,互补配置
(5)properties与yml文件内容相互转换的网址
https://www.toyaml.com/index.html
(6)@Value获取值和@ConfigurationProperties获取值比较
- 松散语法是指lastName可以以last-name的形式来赋值
- 校验需要加上@Validated注解,校验格式,例如属性有@Email注解时,赋值需要是合法邮箱
- SpEL是指赋值#{11*2}这样的表达式直接获得结果22
(7)其他配置方法
@PropertySource:防止全局application.properties配置文件巨大,再开一个person.properties配置文件来写东西
@PropertySource(value = {"classpath:person.properties"}) @Component @ConfigurationProperties(prefix = "person")
@Data public class Person {
即使它看起来是灰色的,但也是可以识别的
(8)、poperties占位符
- ${random.value}
- ${random.uuid}
- ${random.int(10)}
- ${random.int([min],[max])}
- ${random.long}
如果前面有一个属性,例如person.last-name,写了但没有赋值(没有接上=),后面用${person.last-name}获取的时候当作空字符串
如果属性不存在例如person.last-nameeee,以前会报错,现在是直接把整个【${person.last-name}】当作字符串拼接;不想要这样的话就加上冒号写一个默认值
person.dog.name=${person.last-nameeee}dog #输出:${person.last-nameeee}dog person.dog.name=${person.last-nameeee:霸王别鸡的}dog #输出:霸王别鸡的dog
三、Profile
主配置文件可以写多个,适应各种不同的环境需要,默认的文件是application.properties,其他的命名为application-{profile}.properties/yml
1.properties写法
例如自定义application-dev.properties和application-prod.properties文件,在默认文件中加上这么一句话就可以启动其他的配置文件
spring.profiles.active=dev
2.yml写法
用文档分块[---]的形式当作几个不同的文件,在最上面一个写上激活方式
server:
port: 8081
spring:
profiles:
active: dev #激活
person:
last-name: 默认
---
server:
port: 8082
spring:
profiles: dev
person:
last-name: dev环境
---
server:
port: 8084
spring:
profiles: prod
person:
last-name: prod环境
dev指开发环境,prod或pro指生产环境,test指测试环境,pre指预发布环境