SpringBoot-配置文件相关(五)
SpringBoot-配置文件
配置相关
SpringBoot使用一个全局的配置文件 , 配置文件名称是固定的
- application.properties
- 语法结构 : key=value
- application.yml
- 语法结构 :key:空格 value
配置文件的作用 :修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了;
YAML
YAML是 "YAML Ain't a Markup Language" (YAML不是一种置标语言)的递归缩写。
在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种置标语言)
YAML A Markup Language :是一个标记语言
YAML isnot Markup Language :不是一个标记语言
标记语言
以前的配置文件,大多数都是使用xml来配置;比如一个简单的端口配置,我们来对比下yaml和xml
yaml配置:
server:
prot: 8080
xml配置:
<server>
<port>8081<port>
</server>
YAML语法
基础语法:
k:(空格) v
以此来表示一对键值对(空格不能省略);以空格的缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。
注意 :属性和值的大小写都是十分敏感的。例子:
server:
port: 8081
path: /hello
值的写法
字面量:普通的值 [ 数字,布尔值,字符串 ]
k: v
字面量直接写在后面就可以 , 字符串默认不用加上双引号或者单引号;
“” 双引号,不会转义字符串里面的特殊字符 , 特殊字符会作为本身想表示的意思;
比如 : name: "bao\n sq" 输出 : bao换行 sq
'' 单引号,会转义特殊字符 , 特殊字符最终会变成和普通字符一样输出
比如 : name: ‘bao\n sq’ 输出 : bao\n sq
对象、Map(键值对)
k:
v1:
v2:
在下一行来写对象的属性和值得关系,注意缩进;比如:
student:
name: bao
age: 3
行内写法
student: {name: bao,age: 3}
数组( List、set )
用 - 值表示数组中的一个元素,比如:
pets:
- cat
- dog
- pig
行内写法
pets: [cat,dog,pig]
修改SpringBoot的默认端口号
配置文件中添加,端口号的参数,就可以切换端口;
server.port=8081
注入配置文件
程序实现
1. 如果要使用properties配置文件可能导入时存在乱码现象 , 需要在IDEA中进行调整 , 我们这里直接使用yml文件 , 将默认的 application.properties后缀修改为yml
2. 导入配置文件处理器
<!--导入配置文件处理器,配置文件进行绑定就会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
3.编写yml 配置文件
person:
name: bao
age: 3
happy: false
birth: 2005/01/01
maps: {k1: v1,k2: v2}
lists:
- code
- girl
- music
dog:
name: 旺财
age: 1
4.在SpringBoot的主程序的同级目录下建包,只有这样,主程序才会对这些类生效 ; 我们建一个pojo的包放入我们的Person类和Dog类;
package com.bao.springbootdemo03.pojo;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
/*
@ConfigurationProperties作用:
将配置文件中配置的每一个属性的值,映射到这个组件中;
告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应
只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能
*/
@Component //注册bean
@ConfigurationProperties(prefix = "person")
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 Dog dog;
//get,set方法
//toString方法
}
记得写上 toString()方法,方便调试输出结果
package com.kuang.springbootdemo03.pojo;
public class Dog {
private String name;
private Integer age;
//get、set方法
//toString()方法
}
5.确认无误后,到测试单元中进行测试,看是否注入成功!
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootDemo03ApplicationTests {
@Autowired
Person person ;
@Test
public void contextLoads() {
System.out.println(person);
}
}
JSR303数据校验
spring-boot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。我们这里来写个注解让我们的name只能支持Email格式
@Component //注册bean
@ConfigurationProperties(prefix = "person")
@Validated //数据校验
public class Person {
//@Value("${person.name}")
@Email //name必须是邮箱格式
private String name;
}
运行结果
会报邮箱格式的错误
使用数据校验,可以保证数据的正确性;
加载指定配置文件
1. @PropertySource :加载指定的配置文件;使用@configurationProperties默认从全局配置文件中获取值;
我们去在resources目录下新建一个person.properties文件
name=baobao
然后在我们的代码中指定加载person.properties文件
@PropertySource(value = "classpath:person.properties")
@Component //注册bean
public class Person {
@Value("${name}")
private String name;
......
}
配置文件占位符
随机数
${random.value}、${random.int}、${random.long}、${random.int(10)}等等
占位符引用其他属性的值,如果不存在可以设置默认值
person:
name: bao${random.uuid}
age: ${random.int}
happy: false
birth: 2010/02/01
maps: {k1: v1,k2: v2}
lists:
- code
- girl
- music
dog:
name: ${person.hello:hello}_狗子
age: 1