yml文件使用
yml文件是springboot推荐使用的配置文件格式,它相较于propertites格式文件更强大,比如可以实现SpEl表达式、松散绑定等等。
yml文件格式
1.key,value格式
k: v //注意冒号后面要跟空格
demo-key: v //松散绑定,对应对象属性demoKey
- list格式
k:
- v1
- v2
k: [v1,v2] //行内写法
- map格式
k: {k1: v1,k2: v2}
- 占位符
k: ${random.uuid} //生成uuid
k: ${random.int} //生成随机数
k: ${demo.placeholder:default} //如果demo.placeholder存在则使用demo.placeholder的值,否则使用默认值
使用
在java项目中的resources目录下创建application.yml文件
person:
id: ${random.uuid}
name: 小强
first-name: xiaoQiang
age: ${random.int}
hobby:
- 篮球
- 足球
- 乒乓球
grade: {a: 80,b: 90,c: 95}
remark: ${person.placeholder:default}备注
dog:
name: 旺财
使用方式一(@ConfigurationProperties)
创建对应的实体类
Person.java
package com.example.configuration;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
@Data
@Component
@ConfigurationProperties(prefix = "person") //将person前缀的配置映射到对象属性
public class Person {
private String id;
private String name;
private String firstName;
private Integer age;
private List<String> hobby;
private Map<String,String> grade;
private Dog dog;
private String remark;
}
Dog.java
package com.example.configuration;
import lombok.Data;
@Data
public class Dog {
private String name;
}
创建测试类
@SpringBootTest
class ApplicationTests {
@Resource
private Person person;
@Test
void testConfig(){
System.out.println(person);
}
}
执行测试方法,返回执行结果如下:
Person(id=0d1e376c-3b62-4213-b4ea-82bf85978f53, name=小强, firstName=xiaoQiang, age=-393568359, hobby=[篮球, 足球, 乒乓球], grade={a=80, b=90, c=95}, dog=Dog(name=旺财), remark=default备注)
从上面的执行结果可以看出所有的配置都已经注入到对应的对象属性中,非常方便。
当然除了以上的方法进行属性注入外,还可以单独注入某一个属性值。
使用方式二(@Value)
我们将Dog类修改一下
package com.example.configuration;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Data
@Component
public class Dog {
@Value("${person.dog.name}")
private String name;
}
创建测试类
@SpringBootTest
class ApplicationTests {
@Resource
private Dog dog;
@Test
void testConfig(){
System.out.println(dog);
}
}
执行结果如下
Dog(name=旺财)
可以看到@Value注解可以将配置赋值到对象属性。
说到@Value我们还可以指定配置文件进行配置,下面也来演示一下:
添加配置文件demo.properties
dogName=旺财123
修改Dog.java
package com.example.configuration;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Data
@Component
@PropertySource(value = "classpath:demo.properties") //加载指定的配置文件
public class Dog {
@Value("${dogName}")
private String name;
}
执行测试方法,结果可能会如下出现乱码,那么就要设置IDEA的配置文件格式为UTF-8
Dog(name=旺财123)
修改配置settings–>File Encodings
修改完成后执行测试方法,得到如下结果:
Dog(name=旺财123)
JSR303数据校验
yaml 文件还支持JSR303数据校验,使用此功能需要引入数据校验的starter
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
修改配置文件
person:
id: ${random.uuid}
name: //将姓名删除
first-name: xiaoQiang
age: ${random.int}
hobby:
- 篮球
- 足球
- 乒乓球
grade: {a: 80,b: 90,c: 95}
remark: ${person.placeholder:default}备注
dog:
name: 旺财
Person.java文件做如下修改
package com.example.configuration;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.NotBlank;
import java.util.List;
import java.util.Map;
@Data
@Validated
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String id;
@NotBlank(message = "姓名不能为空")
private String name;
private String firstName;
private Integer age;
private List<String> hobby;
private Map<String,String> grade;
private Dog dog;
private String remark;
}
执行测试方法,此时会出现如下报错,说明数据校验生效了,有了数据校验我们可以有效减少关键配置修改出错的可能性。
Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'person' to com.example.configuration.Person failed:
Property: person.name
Value:
Origin: class path resource [application.yml]:47:8
Reason: 姓名不能为空
总结
从以上的demo中我们可以看到yml格式文件相较与properties配置文件,功能更加强大,所以我们在做springboot项目开发的时候还是优先考虑使用yml格式配置文件。