SpringBoot使用一个全局配置文件,配置文件名固定:

  • application.properties
  • 语法结构:key=value
  • application.yaml(推荐)
  • 语法结构:key:(空格) value

配置文件的作用:修改SpringBoot自动配置的默认值,因为SpringBoot在底层配置好了

yaml:既是一种标记语言,又不是一种标记语言,可以理解为一种格式: 可读性高,用来表达数据序列化的格式

yaml基本语法:(对缩进的要求非常严格)

#普通的key-value:
name: zhangsan

#对象
student:
name: zhangsan
age: 18

#对象的行内写法:
student: {name: zhangsan,age: 18}

#数组:
pets:
- cat
- dog
- pig

#数组的行内写法
pets: [cat,dog,pig]

这里对对象的赋值可以注入到类中。也就是说可以在Java类中创建一个空对象,将对象在yaml文件中赋值。

yaml直接给实体类赋值:

首先创建两个实体类:

package com.example.hellospringboot.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;
import java.util.Map;

@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
public class People {
private String name;
private int age;
private Boolean happy;
private Date birth;
private Map<String,Object> map;
private List<Object> list;
private Dog dog;
}
package com.example.hellospringboot.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;

@AllArgsConstructor
@NoArgsConstructor
@Data
@Component
public class Dog {
private String name;
private int age;
}

1.可以用注解@Value直接给实体类赋值:
直接在实体类的属性上方@Value(“xxx”)即可,这是比较经典的方法。

2.也可以在yaml文件中赋值:很多配置类的属性要与配置文件一一对应就要用到这个方法
例如以上两个类,我们要在application.yaml文件中赋值:

people:
name: zhangsan
age: 18
happy: false
birth: 2018/10/05
maps: {k1: v1,k2: v2}
list:
- music
- dance
- girl

dog:
name: dahuang
age: 2

我们分别给两个对象的所有属性都赋了值,那么接下来要把这两个对象和两个实体类连接起来,规定这两个对象分别是对应的实体类的对象,于是就需要用到标签:@ConfigurationProperties(prefix = "yaml中对应的对象名") 在这里的两个类则分别是@ConfigurationProperties(prefix = "people")和@ConfigurationProperties(prefix = "dog")

package com.example.hellospringboot.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;
import java.util.Map;

@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
@ConfigurationProperties(prefix = "people")
public class People {
private String name;
private int age;
private Boolean happy;
private Date birth;
private Map<String,Object> maps;
private List<Object> list;
private Dog dog;
}
package com.example.hellospringboot.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@AllArgsConstructor
@NoArgsConstructor
@Data
@Component
@ConfigurationProperties(prefix = "dog")
public class Dog {
private String name;
private int age;
}

yaml中对对象属性的赋值还支持很多的占位符表达式:例如random随机数random.int、选择赋值${pepple.hello:hello} 如果person.hello存在就赋值":"前的person.hello 如果不存在就赋值":"后面的hello等等很多的占位符,都可以极大的简化Java代码量。

松散绑定

yaml配置文件给实体类对象赋值是松散绑定的,也就是说:
在yaml中的first-name可以赋值给实体类对象的firstName。

-连接符可以赋值给对应的驼峰命名属性。

下面一个例子:

dog:
  first-name: 大黄
  age: 2
package com.example.hellospringboot.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@AllArgsConstructor
@NoArgsConstructor
@Data
@Component
@ConfigurationProperties(prefix = "dog")
public class Dog {
    private String firstName;
    private int age;
}

在测试类中输出对象:

Dog(firstName=大黄, age=2)