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)