欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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: V
dog: 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 + '\'' +
                '}';
    }
}