上一篇我们简单了解了全局配置文件的一些基本信息,加下来我们主要针对properties和yaml两种配置文件的具体用法进行一下深入的学习
生成:使用Spring Initializr方式构建Spring Boot项目时,会在resource目录下自动生成一个空的
application.properties文件
加载:Spring Boot项目启动时会自动加载application.properties文件,然后给对应类的对应属性进行赋值。
我们可以在application.properties文件中定义Spring Boot项目的相关属性,当然,这些相关属性可以
是系统属性、环境变量、命令参数等信息,也可以是自定义配置文件名称和位置
server.port=8081
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.config.name=application
自定义的参数肯定是我们自己定义自己接收,那么一些系统属性、环境变量、命令参数怎么定义又怎么生效呢?
我们用Tomcat的属性来距离看下
上面我们举了个例子,修改或者定义服务的启动端口号,那么有两个问题:
1、类似端口号这种服务的一些配置有哪些?
2、配置的字段名叫什么?配置的值保存在哪里?
我们一起来看一下
首先我们找到spring-boot-autoconfigure,打开spring.factories
然后找到
里面有一个
我们进去看一下
这一句是重点,我们可以看到这里使用了EnableConfigurationProperties注解引入了ServerProperties.class
@EnableConfigurationProperties({ServerProperties.class})
那么就是它了,我们来看一下,都有哪些属性,以及是怎么配置生效的
好了,通过上面的这些截图我们就可以知道了:
1、类似端口号这种服务的一些配置有哪些?
2、配置的字段名叫什么?配置的值保存在哪里?
都在这个ServerProperties类里面,至于配置key的格式也很明显,就是server.字段名,配置的值都会给这个类进行赋值,使用的就是set的方式
上面我们举了一个例子来看系统的属性配置修改,这里我们通过一个案例来看一下自定义配置属性的具体使用
预先准备了两个实体类文件,后续会演示将application.properties配置文件中的自定义配置属性注入 到Person实体类的对应属性中
public class Pet {
private String type;
private String name;
// 省略属性getXX()和setXX()方法 // 省略toString()方法
}
@Component //用于将Person类作为Bean注入到Spring容器中
@ConfigurationProperties(prefix = "person") //将配置文件中以person开头的属性注入到该类 中
public class Person {
private int id; //id
private String name; //名称
private List<String> hobby; //爱好
private String[] family; //家庭成员
private Map<String, String> map;
private Pet pet; //宠物
// 省略属性getXX()和setXX()方法
// 省略toString()方法 }
**
@ConfigurationProperties(prefix = “person”)注解的作用是将配置文件中以person开头的属性值通过 setXX()方法注入到实体类对应属性中
@Component注解的作用是将当前注入属性值的Person类对象作为Bean组件放到Spring容器中,只有这样才能被@ConfigurationProperties注解进行赋值
**
我们写完两个类以后发现出现了如下的飘红:
什么影响呢?
我们既然已经定义好了属性类,那么接下来肯定要去application.properties文件中进行配置属性值,那么格式肯定就是如下这样的:
person.id=1
person.name=jack
但是我们发现我们写这些属性的key的时候是不会有提示的,那么怎么解决呢?
很简单,我们只需要引入下面这个注解即可:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
看下效果:
可以看到预览已经出来了
接下来打开项目的resources目录下的application.properties配置文件,在该配置文件中编写需要对 Person类设置的配置属性
person.id=1
person.name=jack
person.hobby=吃饭,睡觉,打豆豆
person.family=father,mother
person.map.k1=v1
person.map.k2=v2
person.pet.type=dog
person.pet.name=旺财
好了测试一下:
现引入一下junit包,测试代码如下:
@RunWith(SpringRunner.class)
@SpringBootTest
class Springboot01DemoApplicationTests {
@Autowired
private Person person;
@Test
void contextLoads() {
System.out.println(person);
}
}
可以看到测试方法configurationTest()运行成功,同时正确打印出了Person实体类对象。至此,说明 application.properties配置文件属性配置正确,并通过相关注解自动完成了属性注入
properties文件格式的配置格式就讲完了,这里有一个重点我们后边再深入学习,那就是**@ConfigurationProperties**注解
下面我们讲一下yaml格式的配置方式
定义:YAML文件格式是Spring Boot支持的一种JSON超集文件格式,以数据为中心,比properties、xml等更
适合做配置文件
好处:
yaml和xml相比,少了一些结构化的代码,使数据更直接,一目了然
yaml相比properties文件更简洁(JSON超集文件格式,在配置比较多的情况下会更清晰)
格式:
YAML文件的扩展名可以使用.yml或者.yaml
application.yml文件使用 “key:(空格)value”格式配置属性,使用缩进控制层级关系。
这里我们针对不同数据类型的属性值,介绍一下YAML
当YAML配置文件中配置的属性值为普通数据类型时,可以直接配置对应的属性值,同时对于字符串类型的属性值,不需要额外添加引号,示例代码如下
server:
port: 8080
servlet:
context-path: /hello
当YAML配置文件中配置的属性值为数组或单列集合类型时,主要有两种书写方式:缩进式写法和行内式写法。
其中,缩进式写法还有两种表示形式,示例代码如下
person:
hobby:
- play
- read
- sleep
或者使用如下格式
person:
hobby:
play,
read,
sleep
上述代码中,在YAML配置文件中通过两种缩进式写法对person对象的单列集合(或数组)类型的爱好 hobby赋值为play、read和sleep。其中一种形式为“-(空格)属性值”,另一种形式为多个属性值之前 加英文逗号分隔(注意,最后一个属性值后不要加逗号)。
person:
hobby: [play,read,sleep]
通过上述示例对比发现,YAML配置文件的行内式写法更加简明、方便。另外,包含属性值的中括 号“[]”还可以进一步省略,在进行属性赋值时,程序会自动匹配和校对
当YAML配置文件中配置的属性值为Map集合或对象类型时,YAML配置文件格式同样可以分为两种书写
方式:缩进式写法和行内式写法。
其中,缩进式写法的示例代码如下:
person:
map:
k1: v1
k2: v2
对应的行内式写法示例代码如下
person:
map: {k1: v1,k2: v2}
在YAML配置文件中,配置的属性值为Map集合或对象类型时,缩进式写法的形式按照YAML文件格式编 写即可,而行内式写法的属性值要用大括号“{}”包含。
接下来,在Properties配置文件演示案例基础上,通过配置application.yaml配置文件对Person对象进 行赋值,具体使用如下:
(1)在项目的resources目录下,新建一个application.yaml配置文件,在该配置文件中编写为Person 类设置的配置属性
#对实体类对象Person进行属性配置 person:
id: 1
name: lucy
hobby: [吃饭,睡觉,打豆豆]
family: [father,mother]
map: {k1: v1,k2: v2}
pet: {type: dog,name: 旺财}
可以看出,测试方法configurationTest()同样运行成功,并正确打印出了Person实体类对象。
上面可以看到我的截图中好几个都由于中文导致了输出结果的乱码,只需要我们在pom文件中进行一下配置即可处理
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!-- spring-boot:run 中文乱码解决 -->
<configuration>
<fork>true</fork>
<!--增加jvm参数-->
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
</configuration>
</plugin>
</plugins>
</build>
我在自测的时候出现过现在生成的properties文件进行配置,然后手动新建一个yaml文件配置以后发现没有生效,问题我也解决了,这里记录一下
只需要重新刷新一下本地的maven进行重新打包就行,原因是自己手动创建的yaml文件在打包后的target文件夹下并没有或者格式不对,重新打包就好了,效果如下:
关于properties文件和yaml文件两种配置文件的学习就先到这里,这一块我们遗留了一个知识点@ConfigurationProperties注解的详细使用和原理,我们接下来一节接着讲