YAML语法
1. YAML基本语法:
key: 空格value 表示一对键值对(空格必须要有)
以空格的缩进来空值层级关系:只要是左对齐的一列数数据都是同一层级的。
server:
port: 8081
path: /hello
属性和值也是大小写敏感的。
2. 值的写法
字面量:普通的值(数字,字符串,布尔)
k: v 字面量直接来写
字符串不用加上单引号或者双引号
“”:双引号:不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思。
name:“zhangsan \n list” :输出:zhangsan 换行 list
‘’:单引号:会转移特殊字符,特殊字符最终就会被转为一个普通的字符串。
name:“zhangsan \n list” :输出:zhangsan \n list
对象、Map (属性和值)(键值对):
k: v 在下一行来写对象的属性和值的关系;注意缩进
对象还是k: v的方式
- 正常写法
friends:
lastName: zhangsan
age: 20
- 行内写法:
friends: {lastName: zhangsan,age: 18}
数组(List、set):
用 -值表示数组中的一个元素
- 正常写法
pets:
- cat
- dog
- pig
- 行内写法
pets: [cat,dog,pig]
3. 配置文件值注入
yaml配置配置文件写法
person:
birthday: "2020-01-01"
name: zhangsan
age: 55
pets: [cat,dog,pig]
isBoss: true
friends:
- lisi
- wangwu
- zhaoliu
maps: {k1: v1,k2: 12}
/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中;
* @ConfigurationProperties : 告诉SpringBoot将本类中的所有属性和配置文件中相关的属性进行 * 绑定;
* prefix = “peron” : 配置文件中哪个下面的所有属性进行一一映射;
* 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能;
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person{
private String lastName;
private Integer age;
private Boolean isBoss;
private Date birthday;
private Map<String,Object> maps;
private List<Friends> friends;
...
}
pom.xml
<!--导入配置文件处理器,配置文件进行绑定就会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
对应的properties写法
person.lase-name=张三
person.age=18
person.birthday=2020/10/10
person.boss=false
person.maps.k1=v1
person.maps.k2=12
person.lists=a,b,c
person.dog.name=dog
person.dog.age=5
- 需要注意的是:在idea中 properties配置文件的默认编码是utf-8
找到idea 设置中的file Encodings ,将对号挑上(在运行时转码),不修改中文就会乱码。
4. 用环境变量、配置文件中获取值
String中的xml值绑定写法
<bean class="Person">
<property name="lastName" value="字面量/${key}从环境变量、配置文件中回去值/#{spEl}">
</bean>
在java代码中获取值
@Component
@ConfigurationProperties(prefix = "person")
public class Person{
@Value("${person.last-name}")
//lastName 必须是邮箱格式
@Email
private String lastName;
@Value("#{11*2}")
private Integer age;
@Value("${maps}")//会注入失败,因为不能匹配复杂数据类型
private Map<String,Object> maps;
}
注解 | @ConfigurationProperties | @Value |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个一个的指定 |
松散绑定 | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
- 如果以@ConfigurationProperties 方式取值上方的@Email会进行校验,而@Vlaue不会进行校验。
- 什么是松散绑定:当以@ConfigurationProperties 进行取值时候last-name 和lastName是一样的。
- spEl :#{12*5} 在{ }内进行计算
如何选择/使用场景:
因为@Value不支持复杂类型数据的封装比如Map,所以如果说是普通数据类型的获取,使用@Value来获取比较好
但是如果说,我们专门编写了一个javaBean来和配置文件进行映射,那么我们就直接使用@ConfigurationProperties
当然它们也可以结合使用
- @PropertySource注解的使用
@ConfigurationProperties(prefix = “person”)默认从全局配置文件中获取值,有的时候需要把不相关的信息写到别的配置文件中,这时候就需要指定该配置文件的位置。
使用@PropertySource注解来指定配置文件的位置
- @ImportResource: 导入Spring的配置文件,让配置文件里面的内容生效。
SpringBoot里面没有Spring配置文件,有的时候我们希望让这些配置文件里面的内容生效。
就是用该@ImportResource注解。
//导入Spring的配置文件让其生效
@ImportResource(locations = {"classpsth:beans.xml"})
- SpringBoot 推荐的给容器中添加组件的方式
使用全注解的方式,使用Java代码进行配置。
@Configuration注解标识是一个配置类
使用@Bean给容器添加组件
- @Bean标签的作用:将方法的返回值添加到容器中,容器中这个组件默认的id就是方法名。
@Configuration
public class MyConfig{
@Bean
public HelloService helloService01(){
System.out.println("配置类@Bean给容器中添加组件了...");
return new HelloService();
}
}
//组件名默认是方法名
- 在配置文件中使用占位符获取之前配置的值,如果没有可以使用:指定默认值。
- 也可以使用随机数生成默认值