spring boot yaml 配置[三]
前言
我们知道java 因为历史的原因,一直有一个配置地狱的痛点。那么如何解决掉它呢?
spring boot 是一柄利器,但是呢,还是要配置。
看来配置的避免不了的了。
那么如何可以减轻这种痛苦呢?
yaml 就是一个减轻的利器。
正文
yaml 是什么呢? yaml ain't markup language
这是什么意思呢?解释的不是一门标记语言。但是无论它怎么说,他的确是作为标记语言存在的。
那么这个yaml配置放在哪里里?
放在这下面哈。
先来熟悉一下yaml语法吧,这里只是做一些我自己经验。
下面是菜鸟的,我认为起码应该熟悉这个。
基本语法
大小写敏感
使用缩进表示层级关系
缩进不允许使用tab,只允许空格
缩进的空格数不重要,只要相同层级的元素左对齐即可
'#'表示注释
数据类型
YAML 支持以下几种数据类型:
对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
纯量(scalars):单个的、不可再分的值
1.key:value
string 类型默认不用加"" 或者 ''
这种类型的话:"" 会转义,'' 不会转义。
- 对象的时候:
friend:
lastname: bob
firstname: z
如果是简单的对象建议这样写:friend:{ lastname:bob,firstname:z}
2.这里介绍一下数组,支持两种写法:
sex
- boy
- girl
如果是简单的数组。那么我建议这样写: sex:[boy,girl]
yaml 读取
yaml 除了这样写能让spring boot读取到,这是系统自动会去读取server。
那么我们自己定义的配置该如何读取?
person 类
package com.axm.demo.bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @ConfigurationProperties
*/
@Component
@ConfigurationProperties(prefix ="person")
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;
public String getLastName() {
return lastName;
}
@Override
public String toString() {
return "Person{" +
"lastName='" + lastName + '\'' +
", age=" + age +
", boss=" + boss +
", birth=" + birth +
", maps=" + maps +
", lists=" + lists +
", dog=" + dog +
'}';
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public boolean isBoss() {
return boss;
}
public void setBoss(boolean boss) {
this.boss = boss;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public Map<String, Object> getMaps() {
return maps;
}
public void setMaps(Map<String, Object> maps) {
this.maps = maps;
}
public List<Object> getLists() {
return lists;
}
public void setLists(List<Object> lists) {
this.lists = lists;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
}
dog 类
package com.axm.demo.bean;
public class Dog {
private String name;
private Integer ages;
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", ages=" + ages +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAges() {
return ages;
}
public void setAges(Integer ages) {
this.ages = ages;
}
}
那么在yml中这样写:
person:
lastName: zhangsan
age: 18
boss: false
birth: 2017/12/12
maps: {k1: v1,k2: 12}
lists:
- lisi
- zhaolu
dog:
name: 小狗
这里需要配置的是person中增加注解:
@Component
@ConfigurationProperties(prefix ="person")
pom.xml 中增加:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
测试其是否配置成功:
package com.axm.demo;
import com.axm.demo.bean.Person;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
class DemoApplicationTests {
@Autowired
Person person;
@Test
void contextLoads() {
System.out.println(person);
}
}