本篇博客主要介绍yml语法与使用,@Value和@ConfigrationProperties的选择使用
一、Properties介绍
.properties作为大量的使用,在配置文件中,这里不多过多介绍
但是在IDEA编译器,乱码设置还是需要注意的(eclipse设置不了)
Settings->Editor->File Encodings,将自动转换勾选上,乱码就解决了
二、yml语法介绍
1、语法:k:(空格)v 表示一对键值对(
空格必须有
),
属性和值也是大小写敏感,
yml语法空格要求很重要
2、演示一个完整的写法
person:
last-name : 张三
age : 20
date : 1990/1/1
如果是.properties写法就是
person.last-name=张三
person.age=2
person.date=1990/1/1
3、SpringBoot项目加入yml提示,在pom.xml引入依赖
<!-- yml配置文件,获得提示信息 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
4、不同类型使用
字面量 :普通的值(数字,字符串,布尔) | k : v |
对象、Map |
假设有dog(属性age,name)、maps集合两个对象成员变量 使用标准语法: dog : age:2 name :土狗
dog :{age : 2, name : 土狗} maps : {k1 : v1, k2 : v2} |
数组 |
假设有int数组num对象成员变量 使用标准语法: num : – 2 – 4
num : [2, 4] |
字面需要注意:
- 字符串默认不用加上单引号或者双引号
- “”:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表达的意思
- name: “zhangsan \n lisi”:输出;zhangsan 换行 lisi
- ”:单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
- name: “zhangsan \n lisi”:输出;zhangsan \n lisi
三、读取一个类的配置文件
如下类,已经跟配置文件进行关联,关联方式使用@ConfigurationProperties(prefix = “person”)
就是说可以通过配置文件,通过person设置类的值
package com.test.yml;
import java.util.Arrays;
import java.util.Date;
import java.util.Map;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 将配置文件中配置的每一个属性的值,映射到这个组中
* @ConfigrationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
* perfix="person" :配置文件中哪个下面的所有属性进行--映射
* 只有这个组件是容器中的组件,才能容器提供@ConfigrationProperties功能,所以加@Component
* @author xuexue
*
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private int age;
private Date date;
private Map<Integer,Integer> maps;
private int[] lists;
private Dog dog;
@Override
public String toString() {
return "Person [lastName=" + lastName + ", age=" + age + ", date=" + date + ", maps=" + maps + ", lists="
+ Arrays.toString(lists) + ", dog=" + dog + "]";
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@JsonFormat(pattern="yyyy-MM-dd",timezone="GMT+8")
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public Map<Integer, Integer> getMaps() {
return maps;
}
public void setMaps(Map<Integer, Integer> maps) {
this.maps = maps;
}
public int[] getLists() {
return lists;
}
public void setLists(int[] lists) {
this.lists = lists;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
}
package com.test.yml;
public class Dog {
private String name;
private int age;
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
通过配置文件,通过person设置类的值
application.properties配置(
最后结果会发现优先使用此配置文件
)
#properties属性
person.last-name=张三
person.age=2
person.date=1990/1/1
person.dog.name=""
person.dog.age=1
person.lists=1,2,3
person.maps.2=3
person.maps.3=4
application.yml配置
#通过yaml绑定,注入数据
person:
last-name : 张三
age : 20
date : 1990/1/1
maps : {1 : 2, 2 : 3}
lists :
- 2
- 3
dog :
name : dog
age : 1
编写测试文件,读取类是否存在信息
package com.test;
import org.junit.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;
import com.test.yml.Person;
@RunWith(SpringRunner.class)
@SpringBootTest
public class Test1 {
@Autowired
Person person;
@Test
public void contextLoads() {
System.out.println(person);
}
}
结果1
,会发现优先使用了.properties的配置文件配置的信息,而且乱码(上面已经解决此问题,这里是eclipse,目前也解决不了)
注释掉.properties配置文件,重启后测试,将会自动使用.yml文件,
结果2
如下
四、@Value和@ConfigurationProperties获取值比较及其选择
1、@Value获取属性值语法:
@Value(“${变量}”)
———–注意{}括号内不能有空格
2、@ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
- 修饰在一个类上@ConfigrationProperties(perfix=”person”)
- perfix=”person”:配置文件中哪个与修饰类的所有属性进行–映射
3、@Value获取值和@ConfigurationProperties获取值比较
功能 | @ConfigurationProperties | @Value |
松散绑定(松散语法) |
批量注入配置文件中的属性 支持(lastName 和 last-name) |
一个个指定 支持(lastName 和 last-name),要一一对应 |
SpEl | 不支持(不可以加入运算) | 支持 |
JSR303数据检验 | 支持(邮箱验证等,@Validated) | 不支持 |
复杂类型封装(map等) | 支持 | 不支持 |
4、选择使用
无论配置文件yml还是properties他们都能获取到值
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value
如果说,我们专门编写一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties
properties优先级高于yml,优先读取properties使用
properties 中文读取乱码,解决,用yml或者idea可以转换,eclipse不支持
五、@PropertySource注解指定配置文件
如果要指定配置文件,不使用全局的application.properties和application.yml配置文件,就需要在类上加此注解
加了后,在resource下创建person.properties即可