springboot配置——yaml,@Value与@ConfigurationProperties用法和区别
程序员文章站
2022-04-19 22:34:30
...
1.yaml 以数据为中心
yaml
server:
port:8080
xml:
<server>
<port>8080</port>
</server>
2.基本语法:
Key:空格Value
以空格来控制层级关系
属性和值区分大小写
3.值的写法:
字符串默认不加引号
双引号:不转义字符串中的特殊字符,特殊字符就会产生其该有的效果
单引号:转义字符串,一视同仁,全是字符串,没有特殊
对象的写法:
K: Vdog: name: xiaobai age: 2
行内写法:```dog:{name: xiaobai,age: 2}
数组写法(List,set):
语法:(减空格值)
- 值
dog:
- xiaobai
- xiaohei
- xiaohuang
行内写法:dog: [xiaobai,xiaohei,xiaohuang]
4.配置文件注入方式:
首先
使用@ConfigurationProperties标注需要配置的实体类
可能会出错,
加入依赖:
org.springframework.boot
spring-boot-configuration-processor
true
之后如果ConfigurationProperties继续报错:Not registered via @EnableConfigurationProterties or marked as……
解决办法:加上@Component注解
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private int age;
private String kind;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getKind() {
return kind;
}
public void setKind(String kind) {
this.kind = kind;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", kind='" + kind + '\'' +
'}';
}
}
配置文件:
person:
name: 狗子
age: 12
kind: 狗
使用@Value注入属性的值:
“”字面量
${}可以获取环境变量和配置文件中的值
#{}是spEl即spring的EL表达式
@Component
//@ConfigurationProperties(prefix = "person")
public class Person {
@Value("${person.name}")
private String name;
@Value("#{2*10}")
private int age;
@Value("狗子")
private String kind;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getKind() {
return kind;
}
public void setKind(String kind) {
this.kind = kind;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", kind='" + kind + '\'' +
'}';
}
}
[email protected]和@ConfigurationProperties比较
:
前者不支持批量注入配置文件中的属性,不支持松散语法绑定,支持SpEL语法,不支持JSR303校验
# | @Value | @ConfigurationProperties |
---|---|---|
功能 | 一个个指定 | 支持批量注入配置文件中的属性 |
松散语法绑定 | 不支持 | 支持 |
spEL语法 | 不支持 | 支持 |
JSR303校验 | 不支持 | 支持 |
复杂类封装 | 不支持 | 支持 |
综上所述,
如果只是在某个业务逻辑中需要配置文件中的值,使用@Value足矣
如果专门编写一个javaBean来和配置文件进行映射,就是用强大的@ConfigurationProperties
6.配置文件注入数据校验:
类上加@Validated
@Validated
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private int age;
private String kind;
@Email
private String email;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getKind() {
return kind;
}
public void setKind(String kind) {
this.kind = kind;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", kind='" + kind + '\'' +
", email='" + email + '\'' +
'}';
}
}