1、yaml相关语法
- application.yaml语法结构
key:空格value
application.yaml的作用:
修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了;
字面量:普通的值 [ 数字,布尔值,字符串 ]
字面量直接写在后面就可以 , 字符串默认不用加上双引号或者单引号;
name: 张三
注意:
-
“ ” 双引号,不会转义字符串里面的特殊字符 , 特殊字符会作为本身想表示的意思;
比如 :name: "张\n三" 输出 :张换行三
-
'' 单引号,会转义特殊字符 , 特殊字符最终会变成和普通字符一样输出
比如 :name: ‘张\n三’ 输出 :张\n三
对象、Map(键值对)
//多行写法
people:
name: 张三
age: 22
//行内写法
people: {name: 张三, age: 22}
数组&集合( List、set )
//多行写法
fruits:
- apple
- pear
- watermelon
//行内写法
fruits: [apple,pear,watermelon]
2、yaml注入
- 编写User 实体类
package com.wust.springboot.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
/*
@ConfigurationProperties作用:
将配置文件中配置的每一个属性的值,映射到User实体类中;
告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
参数 prefix = “user” : 将配置文件中的person下面的所有属性一一对应
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@ConfigurationProperties(prefix = "user")
public class User {
private String username;
private int age;
private Map<String,String> maps;
private List<String> list;
private Dog dog;
}
在User实体类中添加@ConfigurationProperties(prefix = "user") 注解后,idea会有如下提示:
这个提示是idea告诉我们需要导入一个依赖
<!-- 导入配置文件处理器,配置文件进行绑定就会有提示,需要重启 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
- 配置yaml
user:
username: 张三
age: 22
maps: {chinese: 90,math: 100}
list:
- play basketball
- watch movie
- watch animation
dog:
name: xiaoming
age: 3
- 测试
@Autowired //也可以使用@Resource
User user; //注入user
@Test
public void contextLoads() {
System.out.println(user);
}
3、加载指定的配置文件
@PropertySource :加载指定的配置文件;
@configurationProperties:默认从全局配置文件中获取值;
- 在resources目录下新建一个user.properties
username=张三
- 在User实体类中指定加载user.properties
package com.wust.springboot.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@PropertySource(value = "classpath:user.properties")
public class User {
private String username;
private int age;
private Map<String,String> maps;
private List<String> list;
private Dog dog;
}
4、回忆Spring使用@Value给bean注入属性的值
@Component //注册bean
public class Dog {
@Value("阿黄")
private String name;
@Value("18")
private Integer age;
}
5、配置文件占位符
user:
username: 张三${random.uuid} # 随机uuid
age: ${random.int} # 随机int
maps: {chinese: 90,math: 100}
list:
- play basketball
- watch movie
- watch animation
dog:
name: ${user.username}的xiaoming
age: 3
6、yaml松散绑定
- 编写实体类Dog
package com.wust.springboot.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@ConfigurationProperties(prefix = "dog")
public class Dog{
private String dogName;
}
-
编写yaml配置文件
dog:
dog-name: 小明
通过上述两个文件中的dogName和dog-name可知,yaml支持将dog-name松散绑定为对应实体类的dogName,即对应驼峰命名的字段
7、properties、yaml配置文件在写中文的时候会乱码,需要在idea中配置文件编码格式为UTF-8
8、yaml的多文档块
- 使用yaml可以不需要创建多个配置文件。
server:
port: 8081
#选择要激活那个环境块
spring:
profiles:
active: prod
---
server:
port: 8083
spring:
profiles: dev #配置环境的名称
#配置项目的访问路径
servlet
context-path: /
---
server:
port: 8084
spring:
profiles: prod #配置环境的名称
- 也可以 编写多个配置文件,然后在application.yml(后缀为yaml或者yml都行)配置,指定具体环境下的配置文件生效。
//使用开发环境下的配置文件
spring:
profiles:
active: dev
9、加载配置文件的优先级
- file: ./config/ (当前项目路径config目录下);
- file: ./ (当前项目路径下);
- classpath:/config/ (类路径config目录下);
- classpath:/ (类路径config下);
最后还可以通过spring.config.location来改变默认的配置文件位置