目录
前言
一、配置文件有什么用?
二、 关于YAML和properties的说明
yml与properties的两点特殊说明
三、properties配置文件说明
3.1、properties基本语法
3.2、使用@Value注解读取配置文件
3.3、properties配置文件的优缺点分析
四、yml配置文件说明
4.1、yml基本语法
4.2、yml优缺点分析
4.3、yml中的多种数据类型与配置文件的读取
关于yml配置文件中的String的特殊说明:
4.4、yml中的对象和集合的配置和读取(不常用)
4.4.1、配置对象
读取配置对象 :
4.4.2、配置集合
读取集合:
五、设置不同环境的配置文件
本篇博客主要介绍的是Spring Boot中YAML和properties两种不同形式的配置文件的基本语法、读取配置文件、两种配置文件各自的优缺点,以及yml中配置对象、集合,读取对象与集合等等....
整个项⽬中所有重要的数据都是在配置⽂件中配置的,比如:
●数据库中的连接信息,(用户名、密码、url之类的)
●项⽬的启动端⼝;
●第三⽅系统的调⽤秘钥等信息;
●⽤于发现和定位问题的普通⽇志和异常⽇志等。
想象⼀下如果没有配置信息,那么 Spring Boot 项⽬就不能连接和操作数据库,甚⾄是不能保存可以⽤于排查问题的关键⽇志,所以配置⽂件的作⽤是⾮常重要的。
YAML也可以简写成yml,在项目中以哪一个为后缀是一样的,yml和properties其实是属于不同时代的产物,yml和properties的作用是一样的,区别就只在于写法不一样。就类似于工厂中的厂服是一个道理,properties是属于旧的厂服,而yml就是新的厂服一个意思。
properties和yml是可以存在于同一个项目当中的,当存在同一个项目中时,如果两个配置文件出现相同的配置时,在Spring Boot中是采用优先级来解决这个相同配置的问题的,properties的优先级是高于yml的,所以当出现相同配置时,是以properties的配置为主的。
虽然properties 可以和 yml 共存,但实际的业务当中,我们通常会采取⼀种统⼀的配置⽂件格式,这样可以更好的维护(降低故障率)。这就好像连锁店的服饰⼀样,不管是⽼款的服装还是新款的服装,⼀定要统⼀了才好看。
properties的基本语法格式非常简单,采用的是key=value的形式,左边是key,右边是value,中间使用等号连接,不需要有多余的空格。
代码如下:
代码如下:
通过代码我们可以看出:当我们在@Value中的参数设置为字符串不加任何东西时,就会读到@Value中的字符串,如果要读到配置文件中的内容时,就必须要加${},在{}中加上要读的配置项的名字,然后可以根据要读的内容的数据类型来选择对应的类型来接收,比如上面代码中读的都是端口号,端口号是一个整数,所以我们就可以使用int、Integer来接收,当然使用String接收也是可以的。
优点:properties采用的是key=value的格式,等号两边即使多出空格也不会报错,格式简单,易于理解和书写,语法要求不高,不易出错,适合新手使用。
缺点:properties代码比较冗余;比如配置数据库连接信息的时候,前面一部分都是重复的,但是却无法省略,如下所示:对于代码冗余的问题,yml中就很好的解决了
yml的语法格式比较的复杂一些,格式类似于json,但是键和值之间必须使用英文冒号+空格隔开,(这里使用一个或多个都可以,一般使用一个),上下级之间还必须要有空格隔开,这里一般是两个空格。在IDEA中,如果有出错了,就会有红线报错或者没有高亮显示。
正确代码如下:
错误代码演示如下:
优点:
1.yml 是⼀个可读性⾼,写法简单、易于理解,它的语法和 JSON 语⾔类似。
2.yml ⽀持更多的数据类型,它可以简单表达清单(数组)、散列表,标量等数据形态。它使⽤空⽩符号缩进和⼤量依赖外观的特⾊,特别适合⽤来表达或编辑数据结构、各种配置⽂件等。
3.yml ⽀持更多的编程语⾔,它不⽌是 Java 中可以使⽤在 Golang、PHP、Python、Ruby、 JavaScript、Perl 中
缺点: 语法要求较高,对新手不友好,书写容易出错
多种数据类型的演示:
在yml中,读取配置文件的方法和properties是相同的,都是使用@Value注解来实现的,具体代码如下所示:
对于String类型的值,加双引号与加单引号以及不加任何符号的区别:
以下是在配置文件中的自定义的三个String类型的值,对于以下代码,我们所期望的是,在输出hello之后换个行再输出world。
读取配置文件:
通过结果可以看出,加双引号的字符串才可以输出一些特殊的转义字符,加单引号或者不加的效果是一致的,都是输出原字符串。
配置对象的两种方式:
方式1:
#配置对象
student:
id: 1
name: zhangsan
age: 18
方式2:
# 使用行内方式配置对象
student2: {id: 2,name: lisi,age: 18}
我们这里读取对象不能再使用@Value注解了,并不是说@Value不能使用了,只不过@Value一次只能读一个值,但是对象中存在非常多的值,使用@Value非常麻烦,所以这里我们需要使用@ConfigurationProperties注解搭配一个与配置文件中字段一样的类来使用,才可以正确读取。
与配置文件对于的类:
package com.example.blog_properties.model;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "student")//这个注解不能省
@Component
@Data//使用Data注解之后就可以自动生成get和set还有toString方法
public class Student {
private int id;
private String name;
private int age;
}
运行结果如下:
这里我们是可以正确读到配置文件中的对象的,我们是直接使用了@Autowired注解获取到student对象,因为我们前面已经在Student类中加了@ConfigurationProperties注解了,这个注解已经将配置文件中对象的值赋值给了类中的属性,所以可以直接使用属性注入拿到对象了。值得注意的是,这个类中的属性如果没有set方法的话,是会直接报错的,就会无法对类属性进行赋值。
配置集合的两中方式:
方式1:
#配置结合
list:
name:
- zhangsan
- lisi
- wangwu
方式2:
#配置集合的行内方法
list2: {name: [11,22,33]}
读取集合的方式和读取对象是类似的,都是使用@ConfigurationProperties注解来读取的,代码如下所示:
为什么需要配置不同环境下的配置文件?
设置不同环境的配置文件是为了在不同的运行环境中使用不同的配置参数,以满足各个环境的需求和要求。不同的环境可能包括开发环境、测试环境、生产环境等。
以下是设置不同环境的配置文件的一些原因:
1.配置参数的差异:不同的环境可能需要不同的配置参数,例如数据库连接信息、日志级别、缓存配置等。通过使用不同的配置文件,可以根据环境的需求来设置相应的参数,以确保应用程序在不同环境中正常运行。
2.安全性和隔离性:某些配置参数可能包含敏感信息,如密码、密钥等。通过使用不同的配置文件,可以将敏感信息隔离在特定环境的配置文件中,避免在开发或测试环境中泄露敏感信息。
3.管理和维护的便利性:通过使用不同的配置文件,可以更方便地管理和维护不同环境的配置。在开发和测试过程中,可以轻松地切换不同的配置文件,而无需手动修改配置参数。
通常,为不同环境创建配置文件的方式有多种。一种常见的方式是使用不同的文件名或文件路径来区分不同环境的配置文件。例如,可以使用 "application-dev.properties" 表示开发环境的配置文件,"application-test.properties" 表示测试环境的配置文件,"application-prod.properties" 表示生产环境的配置文件。
另一种方式是使用配置文件中的特定标识或属性来区分不同环境。例如,可以在配置文件中添加一个名为 "environment" 的属性,值为 "dev"、"test" 或 "prod",然后根据该属性的值来加载相应的配置参数。
选择哪种方式取决于具体的需求和项目的约定。无论使用哪种方式,目的都是为了方便地管理和使用不同环境的配置参数,以确保应用程序在不同环境中的正常运行。
如何设置不同环境下的配置文件:
以下是我设置的四个配置文件:其中application.yml是公共的配置文件,其余三个就是不同环境下的配置文件。值得注意的是,这里的命名是有规则的,不能随便命名,不同环境下的配置文件名都必须是application-xxx(xxx代表的是不同环境的名称)。这是在spring中的规定,在spring中要记住,约定大于配置。
一般来说,主配置文件中是不能出现和不同环境下的配置文件出现相同的配置项的,如果出现了,会以不同环境下的配置项中配置的为主。
我现在在三个配置文件中设置了不同的端口号:
在主配置文件中设置当前要使用的配置文件即可:
当我设置了当前的环境为dev时,启动端口就应该是6666,运行结果如下所示: