springboot读取yml配置⽂件的⼏种⽅式
实际项⽬中⼀般使⽤l作为配置⽂件,下⾯介绍yml的规范和如何读取yml。
yml⽂件书写规范:
1、通过缩进(推荐两个空格)区分层次(不能使⽤tab缩进,否则会报错),较properties更具可读性
2、属性名命名可以使⽤驼峰命名法,也可以使⽤-或者_,⽐如⽤户名可以是userName,user-name,USER_NAME,意思都是⼀样的
3、键值对的书写形式,key跟着冒号,然后空格(不能少),然后是value
各类数据书写形式:
1、数字,字符串,布尔等
# key: value形式
name: zs
age: 20
enable: true
2、数组,集合(List,Set)
# ⽅式⼀:换⾏缩进,使⽤-表⽰⼀个元素(常⽤)
# 如Java bean中的List<String> tels 或者 String[] tels
tels:
- 110
- 120
# List<Users> users
users:
- name: zs
age: 20
-
name: ls
age: 30
# ⽅式⼆:单⾏配置
tels: 110, 120
users: {name: zs, age: 20}, {name: ls, age: 30}
3、Map和对象
# ⽅式⼀:多⾏配置
# 如Map<String, Integer> score或者Score score
score:
chinese: 95
english: 90
# ⽅式⼆:单⾏配置
score: {chinese: 95, english: 90}
读取yml⽂件:
先在l中写好相关配置:
user:
user-name: Mr.Zhang
age: 38
tels:
- 110
- 120
score:
chinese: 95
english: 90
users:
- user-name: zs
age: 5
- user-name: ls
age: 12
⼀、@Value注解(值绑定)
定义⼀个JavaBean,提供get和set⽅法(必须),⽤于接收从yml读取的数据
@Data
@Component
public class Users {
/**
* @Value 值绑定
* 在每个对应的属性上加@Value注解,注解中的内容填写yml中对应的属性,
* 使⽤@Value注解时,yml中的属性名和JavaBean中的属性名可以不对应,但是数据类型需要对应
*/
@Value("${user.userName}")
private String name;
@Value("${user.age}")
private Integer age;
@Value("${sl}")
private String[] tels;
@Value("${user.score}")
private Map<String, Integer> score;
@Value("${user.users}")
private List<Users> children;
}
⼆、@ConfigurationProperties注解(松散绑定)
定义⼀个JavaBean,提供get和set⽅法,⽤于接收从yml读取的数据
/**
* ConfigurationProperties 松散绑定,只需要通过prefix属性指定属性参数名的前缀即可
* 松散绑定的bean属性名需要跟yml中的属性名对应,但是不需要精确匹配,
* yml可依据约定使⽤驼峰(如:userName)、"-"线(如:user-name)、全⼤写加上"_"(如:USER_NAME)
*/
@Data
@Component
@ConfigurationProperties(prefix = "user")
public class Users {
private String userName;
private Integer age;
private String[] tels;
private Map<String, Integer> score;
private List<Teacher> oldTeachers;
private List<Teacher> newTeachers;
}
单元测试:
// 在单元测试中注⼊这个bean
@Autowired
private Users user;
@Test
void testUsers(){
System.out.Name());
System.out.Age());
}
结果:
Mr.Zhang
38
三、YamlMapFactoryBean
通过这个factoryBean可以直接返回⼀个Map,⽽不需要使⽤JavaBean去接收yml读取的值
public static void main(String[] arg0){
YamlMapFactoryBean yamlMapFactoryBean = new YamlMapFactoryBean();
//可以加载多个yml⽂件
yamlMapFactoryBean.setResources(new ClassPathResource("l"));
//通过getObject()⽅法获取Map对象
Map<String, Object> map = Object();
System.out.println(map);
map.keySet().forEach(item -> {
//可以将map中的值强转为LinkedHashMap对象
LinkedHashMap<String, Object> linkedHashMap = (LinkedHashMap<String, Object>) ((item));
System.out.("tels"));
});
}
输出:
{user={user-name=zhangsan, age=18, tels=[134********, 135********, null], score={chinese=95, english=90}, users=[{name=Mr.Zhang, age=29}, {name=Mr.Li, age=39}]}} [134********, 135********]
四、YamlPropertiesFactoryBean
spring怎么读取properties通过这个类可以直接返回Properties对象
public static void main(String[] arg0){
YamlPropertiesFactoryBean factoryBean = new YamlPropertiesFactoryBean();
factoryBean.setResources(new ClassPathResource("l"));
Properties properties = Object();
properties.keySet().forEach(key -> System.out.println(key + "=====" + (key)));
}
输出:
user.age=====18
user.users[0].age=====5
user.users[0].user-name=====zs
user.users[1].age=====15
user.users[1].user-name=====ls
user.score.chinese=====95
lish=====90
user.user-name=====zhangsan
注意:如果读取yml时产⽣报错,显⽰的是yml⽂件有问题,那么很可能是因为yml⽂件中存在的中⽂造成的,那么只需要修改项⽬和这个⽂件的编码即可,⾸先要先将⽂件中的内容全部复制(如果把内容删了之后yml⽂件的编码修改了可能会导致撤回不了,所以要复制),然后File -> Settings -> Editor -> File Encodings打开对应控制⾯板,将⾥⾯所有的编码都改成UTF-8即可。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。