4.YAML的语法
1.基本语法
空格必须存在!
k:(空格)v 表示一对键值对,空格必须存在!!!
以空格的缩进来控制层级关系,左对齐的一列数据属于同一层级:
例如:
server:
port: 8081
path: /hello
属性和值都是大小写敏感的!
2.值的写法
1.字面量:普通得值(数字,字符串,布尔)
k:(空格)v:字面量直接来写
字符串默认不用加上单引号或者双引号
若加上单引号或双引号时:
""双隐号:不会转义字符串中的特殊字符;特殊字符会作为本身要表示的意思
name: "zhangsan\nlisi" 输出:张三 换行 李四
''单引号:会转义特殊字符,特殊字符最终会作为普通的字符串本身
name: 'zhangsan\nlisi' 输出:zhangsan\nlisi
2.对象、Map(属性和值)(键值对)
k:v 在下一行来写对象的属性和值的关系,注意缩进
对象还是k: v的方式
示例:
friend:
lastName: zhangsan
age: 20
第二种写法:行内写法
friend: {lastName: zhangsan,age: 20}
数组(List,Set):用-(空格)值来表示数组中的一个元素
示例:
pets:
- cat
- dog
- pig
数组的行内写法:
pets: [cat,dog,pig]
3.yaml文件绑定到实体类的做法
实体类的写法:
//1.该类并没有写注解
public class Dog {
private String name;
private Integer age;
get/set方法
tostring方法
}
//2.person类
/**
* 将配置文件中配置的每个属性的值,映射到这个组件中
* @ConfigurationProperties标签告诉springboot将本类中的所有属性和配置文件中的相关配置进行绑定
* prefix = "person"表示配置文件中的哪个属性进行一一绑定
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
private boolean boss;
private Date birth;
private Map<String, Object> map;
private List<Object> list;
private Dog dog;
get/set方法
tostring方法
}
2.yaml文件的写法:注意空格和间隙
server:
port: 8081
path: /hello
person:
age: 18
boss: true
birth: 1992/06/06
map:
K1: v1
k2: v2
list: [wmd,ld,张三]
dog:
name: ld
age: 18
name: wmd
3.sringboot的启动类:
@SpringBootApplication-->标注@SpringBootApplication注解:告诉springboot这是配置类
public class SpringbootHelloworldQuickApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootHelloworldQuickApplication.class, args);
}
}
4.测试类:
@RunWith(SpringRunner.class)---->使用springboot的测试类
@org.springframework.boot.test.context.SpringBootTest
public class SpringBootTest {
@Autowired
private Person person;
@Test
public void test01(){
System.out.println(person.toString());
}
}
5.pom文件必须导入
<!--导入配置文件处理器:配置文件进行绑定时就会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
启动步骤:
1.先启动springboot的启动类
2.再启动springboot的测试类
输出:
Person{name='wmd', age=18, boss=true, birth=Sat Jun 06 00:00:00 CST 1992, map={K1=v1, k2=v2}, list=[wmd, ld, 张三], dog=Dog{name='ld', age=18}}
问题:
除了springboot的版本问题导致某些jar包不可用:
可以使用:2.1.3版本,该版本的springboot测试可用
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
2.测试类的层级结构会导致错误!例如
上述也可以使用properties文件进行绑定:
其他不变,prpperties文件写法
person.name=吴孟达
person.age=18
person.birth=1992/06/06
person.map.k1=v1
person.map..k2=v2
person.list=a,b,c
person.dog.name=刘丹
person.dog.age=18
但是输出:
Person{name='���ϴ�', age=18, boss=false, birth=Sat Jun 06 00:00:00 CST 1992, map={k1=v1, k2=v2}, list=[a, b, c], dog=Dog{name='����', age=18}}
发现其输出properties输出中文乱码:
解决如下:
解决properties文件乱码如下:
@ConfigurationProperties和@Value的区别
@ConfigurationProperties
|
@Value
|
|
功能
|
批量注入配置文件中的值
|
一项一项注入配置文件中的值
|
松散绑定
|
支持
|
不支持
|
spel
|
不支持
|
支持
|
JSR303数据校验
|
支持
|
不支持
|
复杂类型封装
|
支持
|
不支持
|
1.松散绑定:
perosn中有一个属性如下:
private String parentName;
application.properties文件中该属性值的写法如下:
1.-的下一位字符表示大写
person.parent-name=吴孟达父
2._的下一位字符表示大写
person.parent_name=吴孟达父
3.PERSON_PARENT_NAME=吴孟达父
2.spel
在配置文件中不能这么写:
person.age=#{12*12}
3.JSR303的数据校验
1.在@ConfigurationProperties
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
@Email----->可以校验name配置是否符合邮箱格式,不符合就报错
private String name;
}
2.在@Value标签
@Component
public class Person {
@Value("${person.name}")
@Email----------------->不能进行校验
private String name;
}
4.复杂类型
@Value("${person.map}")------------->无法进行绑定注入
private Map<String, Object> map;