1.配置文件的作用及格式
在SpringBoot的整个项目中,所有重要的数据都是在配置文件中设置的,比如:
- 数据库的连接信息(包含用户名和密码的设置)
- 项目的启动端口
- 第三方系统的调用密钥等信息
- 用于发现和定位问题的普通日志和异常日志
如果没有配置信息,那么Spring Boot项目就不能连接和操作数据库,甚至是不能保存可以用于排查问题的关键日志,所以配置文件的作用是非常重要的。
Spring Boot的配置文件的分类如下:
1、系统的配置文件,比如连接字符串、日志的相关设置,是系统定义好的。
2、用户自定义的。
Spring Boot的配置文件主要分为以下两种格式:
- .properties
- .yml
properties和yml是两个不同时代的产物,properties就属于iPhone 8,而yml属于最新的iPhone 14 pro Max,yml天然支持中文,如果要想让properties也支持中文,需要进行以下配置:
在Settings搜索栏中搜索encoding
然后将所有位置的编码方式都改成UTF-8
如果想让所有生成的新项目也同样支持中文,再在此处也进行设置:
两种格式的配置文件遵循以下规则:
一个项目中可以存在以上两种配置文件(properties和yml),但是不建议一个项目中出现两种配置文件。
当一个项目的某个配置,出现在两种格式的配置文件中时,尼玛配置项会以properties为主(忽略yml中的配置)
2.properties 配置文件
2.1 基本语法
properties是以键值对的形式配置的,Key和Value之间是以“=”连接的,如:
# 配置项目端口号 server.port=8080 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8mb4&useSSL=true spring.datasourse.name=root spring.datasourse.password=1234 # 自定义配置项 csdn.token=xxx
配置文件中可以使用#来添加注释信息
2.2 读取配置文件
如果想在项目中主动的读取配置文件中的内容,就可以使用@Value注解搭配${}格式来读取,如下代码所示:
@Controller public class UserController { @Value("${server.port}") private String port; @PostConstruct public void UserController(){ System.out.println("post:"+port); } }
运行结果如下:
@Controller在Spring Boot启动的时候会注入到框架中,注入到框架中时会执行@PostConstruct初始化方法,这个时候就能读取到配置信息了。
2.3 缺点分析
像下图这几条配置信息,就有很多的冗余
如果想解决以上冗余问题,就需要使用yml配置文件了。
3.yml 配置文件
3.1 文件说明
yml是YAML的缩写,它的全称Yet Another Markup Language 翻译成中⽂就是“另⼀种标记语⾔”。
其有以下优点:
- 写法简单,可读性高
- 支持更多的数据类型
- 可以跨语言使用,支持更多的编程语言,比如Golang、PHP、Python、Ruby等。
3.2 基本语法
yml配置文件的基础语法是Key: Value,注意key和value之间使用英文冒号加空格的方式组成,其中的空格不能省略。
下边将properties中的配置,在yml文件中进行表示:
# 配置项目端口号 server: 8080 # 连接数据库 spring: datasource: url: jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8mb4&useSSL=true name: root password: 1234 # 自定义配置项 csdn.token: xxx
两者对比:
yml读取配置的方法和properties读取配置的方法相同,都是使用@Value注解搭配${}格式来读取。
3.3 进阶使用
3.3.1 单双引号问题
在配置文件中加上如下配置:
获取配置,查看打印情况:
@Controller public class UserController { @Value("${string1}") private String string1; @Value("${string2}") private String string2; @Value("${string3}") private String string3; @PostConstruct public void UserController(){ System.out.println("string1:"+string1); System.out.println("string2:"+string2); System.out.println("string3:"+string3); } }
在运行结果中可以发现,只有第三行打印结果换行了。
这是因为yml中如果使用了双引号,就会按照原语义执行(\n意为换行),如果是单引号或者什么都不加,那么默认会将字符串中的特殊字符进行自动转义,比如\n->\\n(转义)处理
3.3.2 配置对象
我们还可以在yml中配置对象,有以下两种配置方式:
这个时候就不能用@Value来读取配置中的对象了,此时要使用另一个注解@ConfigurationProperties来读取,具体实现如下:
@Data @ConfigurationProperties(prefix="student2") @Component public class Student { private int id; private String name; private int age; }
@Controller public class UserController { @Autowired private Student student; @PostConstruct public void UserController(){ System.out.println("student2:"+student); } }
运行结果如下:
3.3.3 配置集合
配置文件也可以配置list集合,如下所示:
集合的读取和对象一样,也是使用@ConfigurationProperties来读取的,具体实现如下:
@Component @Data @ConfigurationProperties("dbtypes") public class ReadList { private List<String> name; }
4.properties VS yml
- properties是以key=value的形式配置的键值类型的配置文件,而yml使用的是类似json格式的树形配置方式进行配置的,yml层级之间使用换行缩进的方式配置,key和value之间使用: 英文冒号加空格的方式设置,并且空格不可省略。
- properties是早期并且默认的配置文件格式,但其配置存在一定的冗余数据,使用yml可以很好的解决数据冗余的问题。
- yml通用性更好,支持更多的语言
- yml支持更多的数据类型,比如对象、集合等类型。
5.常用设置
我们的项目通常来说最少会有两个环境,一个是开发环境,另一个是生产环境,那么肯定一些配置文件是要根据环境的不同而做出改变的,这时我们常常使用以下这种设置配置文件的方式。
多个环境共同的配置,放在同一个配置文件下
多个环境不同的配置,分别放在不同的配置文件下,然后在主配置文件中设置运行哪一个配置文件
不同平台配置文件的命名规则:
application-平台.yml(properties)