1.配置文件
1.1简单介绍
spring boot默认会使用一个全局的配置文件,这个配置文件可以是两种格式的文件,一种是.properties,一种是.yaml格式的文件;并且配置文件的名字是固定的,要么是application.properties,要么是application.yaml;
配置文件的作用:修改 Spring Boot配置的默认值,例如端口号等信息;
1.2YAML语法简介
1.2.1简介
YAML:(YAML Ain't Markup Lanuage),这个叫法有两层含义:
YAML A Markup Lanuage:YAML就是一个标记语言;
YAML isn't Markup Lanuage:YAMA不是一个标记语言;
YAML以数据为中心,比json.xml更适合做配置文件;
比如我们想改变spring boot 启动的端口信息,我们在application.properties文件中的语法如下所示:
server.port=8971
但是在application.yaml文件中的语法如下所示:
server:
port: 8089
当然如果同样的工作我们在XML文件中进行配置,语法如下:
<server> <port>8089</port> </server>
1.2.2具体语法
【1】k:(空格)v:表示一对键值对(空格必须有),以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一层级的;
server:
port: 8089
error:
path: /hello
其中server为第一层级,port和error属于同一个层级,path单独属于一个层级;
还需要注意的是,yaml文件中的属性和值大小写敏感;
【2】值的写法
即在yaml文件中都可以写入哪些值,我们常见的值类型如下:
第一类:字面量,普通的值(数字、字符串、布尔)
k: v:字面直接来写,尤其对于字符串类型不需要加入双引号,如果加上双引号有特殊含义,会将字符串中的特殊字符进行专义输出,例如输出"ab \n c",输出:
ab
c
如果加的是单引号,那么特殊字符将会被原样输出,例如:'ab \n c' 输出就是:
ab \n c
第二类:对象、map(属性和值)(键值对);
k: v:在下一行来写对象的属性和值的关系,注意缩进;例如我们现在有个类User,里面有属性name和age写法如下:
user:
name: haige
age: 20
上述的写法还等价于下面这种行内写法:
User{name: haige,age: 20}
第三类:集合数组(List、Set);
用-值表示数组中的一个元素,例如下面有个集合pets,里面有集合原素:pig、dog、cat写法如下:
pets:
-pig
-dog
-cat
述的写法还等价于下面这种行内写法:
pets: [pig,cat,dog]
1.3从YAML配置文件注入属性值
既然YAML配置文件这么方便,那我们需要学会从YAML文件中读取属性。下面通过一个实例进行演示;
具体步骤如下所示:
【1】第一步:声明一个类Person,里面有属性name、age、map集合、list集合,对象等属性;
package com.hai.bao.springboot01; import java.util.Date; import java.util.List; import java.util.Map; /** * @author :haibao.wang * @date :Created in 2019/8/29 22:20 * @description:person类 * @modified By: * @version: $ */ public class Person { private String name; private int age; private boolean boss; private Date birth; private Map<String, Object> maps; private List<Object> lists; private Dog dog; 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 boolean isBoss() { return boss; } public void setBoss(boolean boss) { this.boss = boss; } public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth = birth; } public Map<String, Object> getMaps() { return maps; } public void setMaps(Map<String, Object> maps) { this.maps = maps; } public List<Object> getLists() { return lists; } public void setLists(List<Object> lists) { this.lists = lists; } public Dog getDog() { return dog; } public void setDog(Dog dog) { this.dog = dog; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", boss=" + boss + ", birth=" + birth + ", maps=" + maps + ", lists=" + lists + ", dog=" + dog + '}'; } }
在Person类里面有一个Dog类的属性,Dog类如下:
package com.hai.bao.springboot01; /** * @author :haibao.wang * @date :Created in 2019/8/29 22:23 * @description:新建一个小狗类 * @modified By: * @version: $ */ public class Dog { private String dogName; private int dogAge; public String getDogName() { return dogName; } public void setDogName(String dogName) { this.dogName = dogName; } public int getDogAge() { return dogAge; } public void setDogAge(int dogAge) { this.dogAge = dogAge; } }
【2】在application.yaml文件中配置Person类中相关属性的值;
server:
port: 8089
person:
name: 海哥
age: 18
boss: true
birth: 1990/05/27
maps:
key01: 化学
key02: 物理
lists:
- 跑步
- 游泳
dog:
dogName: 旺财
dogAge: 3
【3】此时在Person类中有提示信息:
此时需要在pom.xml文件中添加配置文件处理器,如下依赖;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
【4】给Person类加上@ConfigurationProperties(prefix = "Person")注解。告诉Spring boot将本类中的所有属性和配置文件中的配置信息一一绑定;
【5】给Person类加上容器的注解,确保组件在容器中,才能够使用@ConfigurationProperties注解;
【6】启动Spring boot服务;
【7】写一个Spring boot的单元测试类,来验证下功能:
package com.hai.bao; import com.hai.bao.springboot01.Person; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class BaoApplicationTests { @Autowired Person person; @Test public void contextLoads() { System.out.println(person); } }
代码运行结果如下:
1.4在.properties文件中去配置Person类的相关属性;
#配置Person类中相关的属性值 person.age=10 person.birth=1990/05/01 person.boss=true person.maps.key01=数学 person.maps.key02=化学 person.lists=瑜伽,游泳 person.dog.dogName=旺财 person.dog.dogAge=2
启动后执行单元测试,测试结果如下:
有乱码,因为IDEA原生的编码格式为utf-8,解决乱码问题的方法如下:
File-settings-File Encodings
@configurationproperties注解和@Value注解的具体区别如下:
- @configurationproperties注解可以批量注入属性,但是@Value只能一个个的注入属性
- @configurationproperties支持松散绑定,但是@Value不支持松散绑定;
- @configurationproperties支持JSR303数据校验,@Value不支持;
- @configurationproperties不支持SpEl,但是@Value支持;
- @configurationproperties支持复杂类型数据,例如map集合,但是@Value不支持;
所以:如果说我们只是在业务逻辑中获取一个业务的值。我们就直接使用@Value注解即可;
如果我们专门编写一个javaBean来和配置文件进行一一映射,这个时候就使用@Configurationproperties注解;