配置文件
SpringBoot使用一个全局的配置文件 , 配置文件名称是固定的
application.properties
语法结构 :key=value
application.yml(官方推荐使用)
语法结构 :key:空格 value
配置文件的作用 :修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了;
YAML概述
YAML是一个可读性高,用来表达数据序列化的格式。YAML参考了其他多种语言,包括:C语言、Python、Perl,并从XML、电子邮件的数据格式(RFC 2822)中获得灵感。Clark Evans在2001年首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者。当前已经有数种编程语言或脚本语言支持(或者说解析)这种语言。
YAML是”YAML Ain’t a Markup Language”(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:”Yet Another Markup Language”(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。
比较:
xml:
<server>
<port>8081</port>
</server>
yaml:
server:
port: 8082
yaml基础语法
语法要求严格!
1、空格不能省略
2、以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。
3、属性和值的大小写都是十分敏感的。
yaml:
#普通的key-value
server:
port: 8082
#对象
student:
id: 01
pwd: admin
#行内写法
student2: {id: 01,pwd: admin}
#数组
number:
- one
- two
- four
number2: [one,two,four]
对比:properties
# 只能保存键值对
name =hecn
student.name= hecn
student.id= 0002
yaml注入配置文件
普通的注入方式:
在springboot项目中的resources目录下新建一个文件 application.yml
编写一个实体类 hero;
package com.hecn.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;
/**
* @author hecn
* @site hecn.gitee.io
* @discription
*/
@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Hero {
private int id;
private double hp;
}
- 给bean注入属性值的
package com.hecn.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;
/**
* @author hecn
* @site hecn.gitee.io
* @discription
*/
@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Hero {
private int id;
private double hp;
}
- 测试类:
package com.hecn;
import com.hecn.pojo.Hero;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class Springboot02ConfigApplicationTests {
@Autowired // 自动注入hero
Hero hero;
@Test
void contextLoads() {
// 打印看下hero对象
System.out.println(hero);
}
}
输出的结果:Hero(name=德玛西亚之力, hp=1000.0)
yaml注入
- 编写实体类
package com.hecn.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;
/**
* @author hecn
* @site hecn.gitee.io
* @discription
*/
@Component // 注册bean到容器中
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
private String name;
private Integer age;
private Boolean happy;
private Date birth;
private Map<String, Object> maps;
private List<Object> lists;
private Hero hero;
// 有参无参构造、get、set方法、toString()方法
}
- 编写yaml配置
person:
name: 张三
age: 21
happy: false
birth: 2000/01/01
maps: {key1: v1,key2: v2}
lists:
- code
- girl
- music
hero:
name: 赵信
hp: 178
- 通过
@ConfigurationProperties(prefix = "person")可以注入到类中
package com.hecn.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;
/**
* @author hecn
* @site hecn.gitee.io
* @discription @ConfigurationProperties作用: 将配置文件中配置的每一个属性的值,映射到这个组件中; 告诉SpringBoot将本类中的所有属性和配置文件中相关
* 的配置进行绑定参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应
*/
@Component // 注册bean到容器中
@ConfigurationProperties(prefix = "person")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
private String name;
private Integer age;
private Boolean happy;
private Date birth;
private Map<String, Object> maps;
private List<Object> lists;
private Hero hero;
// 有参无参构造、get、set方法、toString()方法
}
- IDEA 提示,springboot配置注解处理器没有找到,让我们看文档,我们可以查看文档,找到一个依赖!
<!-- 导入配置文件处理器,配置文件进行绑定就会有提示,需要重启 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
- 确认以上配置都OK之后,去测试类中测试一下:
package com.hecn;
import com.hecn.pojo.Hero;
import com.hecn.pojo.Person;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class Springboot02ConfigApplicationTests {
// 将person自动注入进来
@Autowired Person person;
@Test
void contextLoads() {
// 打印person信息
System.out.println(person);
}
}
结果:Person(name=张三, age=21, happy=false, birth=Sat Jan 01 00:00:00 CST 2000, maps={key1=v1, key2=v2}, lists=[code, girl, music], hero=Hero(name=赵信, hp=178.0))
加载指定的配置文件
@PropertySource :加载指定的配置文件;
@configurationProperties:默认从全局配置文件中获取值;
- 在resources目录下新建一个person.properties文件
name=hecn
- 然后在代码中指定加载person.properties文件
@Component // 注册bean到容器中
//@ConfigurationProperties(prefix = "person")
@PropertySource(value = "classpath:person.properties")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
@Value("${name}")
private String name;
......
}
- 测试
- 结果:
Person(name=hecn, age=null, happy=null, birth=null, maps=null, lists=null, hero=null)
配置文件占位符
配置文件还可以编写占位符生成随机数
person:
name: 张三${random.uuid} # 随机uuid
age: ${random.int}
happy: false
birth: 2000/01/01
maps: {key1: v1,key2: v2}
lists:
- code
- girl
- music
hero:
name: ${person.hello:other}_英雄
hp: 178
结果:Person(name=张三0b2797b0-57ab-4d63-b940-3515c601b74f, age=1219869526, happy=false, birth=Sat Jan 01 00:00:00 CST 2000, maps={key1=v1, key2=v2}, lists=[code, girl, music], hero=Hero(name=other_英雄, hp=178.0))
结论:
配置yml和配置properties都可以获取到值 , 强烈推荐 yml;
如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下 @value;
如果说,我们专门编写了一个JavaBean来和配置文件进行一一映射,就直接@configurationProperties,不要犹豫!
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!