SpringBoot-学习-5-properties和yaml配置文件

文章目录

  • 前言
  • 一、application.properties
    • 1.生成和使用
    • 2.Tomcat的属性位置
    • 3.自定义属性并生效
  • 二、application.yaml
    • 1.什么是yaml文件,有什么好处
    • 2.具体怎么使用
      • (1)value值为普通数据类型(例如数字、字符串、布尔等)
      • (2)value值为数组和单列集合
      • (3)value值为Map集合和对象
    • 3.测试使用
  • 三、补充
    • 1.中文乱码问题解决
    • 2.yaml文件没有生效
  • 总结


前言

上一篇我们简单了解了全局配置文件的一些基本信息,加下来我们主要针对properties和yaml两种配置文件的具体用法进行一下深入的学习


一、application.properties

1.生成和使用

生成:使用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的属性来距离看下

2.Tomcat的属性位置

上面我们举了个例子,修改或者定义服务的启动端口号,那么有两个问题:
1、类似端口号这种服务的一些配置有哪些?
2、配置的字段名叫什么?配置的值保存在哪里?

我们一起来看一下
首先我们找到spring-boot-autoconfigure,打开spring.factories
SpringBoot-学习-5-properties和yaml配置文件_第1张图片
然后找到SpringBoot-学习-5-properties和yaml配置文件_第2张图片
里面有一个
在这里插入图片描述
我们进去看一下
SpringBoot-学习-5-properties和yaml配置文件_第3张图片
这一句是重点,我们可以看到这里使用了EnableConfigurationProperties注解引入了ServerProperties.class

@EnableConfigurationProperties({ServerProperties.class})

那么就是它了,我们来看一下,都有哪些属性,以及是怎么配置生效的
SpringBoot-学习-5-properties和yaml配置文件_第4张图片
SpringBoot-学习-5-properties和yaml配置文件_第5张图片
好了,通过上面的这些截图我们就可以知道了:
1、类似端口号这种服务的一些配置有哪些?
2、配置的字段名叫什么?配置的值保存在哪里?
都在这个ServerProperties类里面,至于配置key的格式也很明显,就是server.字段名,配置的值都会给这个类进行赋值,使用的就是set的方式

3.自定义属性并生效

上面我们举了一个例子来看系统的属性配置修改,这里我们通过一个案例来看一下自定义配置属性的具体使用
预先准备了两个实体类文件,后续会演示将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注解进行赋值
**
我们写完两个类以后发现出现了如下的飘红:
SpringBoot-学习-5-properties和yaml配置文件_第6张图片

什么影响呢?
我们既然已经定义好了属性类,那么接下来肯定要去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>

看下效果:
SpringBoot-学习-5-properties和yaml配置文件_第7张图片
可以看到预览已经出来了
接下来打开项目的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格式的配置方式

二、application.yaml

1.什么是yaml文件,有什么好处

定义:YAML文件格式是Spring Boot支持的一种JSON超集文件格式,以数据为中心,比properties、xml等更
适合做配置文件
好处:
yaml和xml相比,少了一些结构化的代码,使数据更直接,一目了然
yaml相比properties文件更简洁(JSON超集文件格式,在配置比较多的情况下会更清晰)
格式:
YAML文件的扩展名可以使用.yml或者.yaml
application.yml文件使用 “key:(空格)value”格式配置属性,使用缩进控制层级关系。

2.具体怎么使用

这里我们针对不同数据类型的属性值,介绍一下YAML

(1)value值为普通数据类型(例如数字、字符串、布尔等)

当YAML配置文件中配置的属性值为普通数据类型时,可以直接配置对应的属性值,同时对于字符串类型的属性值,不需要额外添加引号,示例代码如下

server:
  port: 8080
  servlet:
    context-path: /hello

(2)value值为数组和单列集合

当YAML配置文件中配置的属性值为数组或单列集合类型时,主要有两种书写方式:缩进式写法和行内式写法
其中,缩进式写法还有两种表示形式,示例代码如下

person:
  hobby:
    - play
    - read
    - sleep

或者使用如下格式

person:
  hobby:
    play,
    read,
    sleep

上述代码中,在YAML配置文件中通过两种缩进式写法对person对象的单列集合(或数组)类型的爱好 hobby赋值为play、read和sleep。其中一种形式为“-(空格)属性值”,另一种形式为多个属性值之前 加英文逗号分隔(注意,最后一个属性值后不要加逗号)。

person:
  hobby: [play,read,sleep]

通过上述示例对比发现,YAML配置文件的行内式写法更加简明、方便。另外,包含属性值的中括 号“[]”还可以进一步省略,在进行属性赋值时,程序会自动匹配和校对

(3)value值为Map集合和对象

当YAML配置文件中配置的属性值为Map集合或对象类型时,YAML配置文件格式同样可以分为两种书写
方式:缩进式写法和行内式写法
其中,缩进式写法的示例代码如下:

person: 
	map:
		k1: v1 
		k2: v2

对应的行内式写法示例代码如下

person:
  map: {k1: v1,k2: v2}

在YAML配置文件中,配置的属性值为Map集合或对象类型时,缩进式写法的形式按照YAML文件格式编 写即可,而行内式写法的属性值要用大括号“{}”包含。

3.测试使用

接下来,在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实体类对象。


三、补充

1.中文乱码问题解决

上面可以看到我的截图中好几个都由于中文导致了输出结果的乱码,只需要我们在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>

2.yaml文件没有生效

我在自测的时候出现过现在生成的properties文件进行配置,然后手动新建一个yaml文件配置以后发现没有生效,问题我也解决了,这里记录一下

只需要重新刷新一下本地的maven进行重新打包就行,原因是自己手动创建的yaml文件在打包后的target文件夹下并没有或者格式不对,重新打包就好了,效果如下:
SpringBoot-学习-5-properties和yaml配置文件_第8张图片

总结

关于properties文件和yaml文件两种配置文件的学习就先到这里,这一块我们遗留了一个知识点@ConfigurationProperties注解的详细使用和原理,我们接下来一节接着讲

你可能感兴趣的:(SpringBoot,spring,boot,java,spring)