目录
整个项⽬中所有重要的数据都是在配置⽂件中配置的,⽐如:
数据库的连接信息(包含⽤户名和密码的设置);
项⽬的启动端⼝; 第三⽅系统的调⽤秘钥等信息;
⽤于发现和定位问题的普通⽇志和异常⽇志等。
想象⼀下如果没有配置信息,那么 Spring Boot 项⽬就不能连接和操作数据库,甚⾄是不能保存可以⽤ 于排查问题的关键⽇志,所以配置⽂件的作⽤是⾮常重要的。
比如我们Spring Boot启动的默认端口是8080,而有时这个端口被占用了,我们想更换一个端口,此时我们可以通过配置文件非常快捷地区修改。比如下面这样:
我们就会发现我们的端口号就从8080变成了8081
这就是配置文件简单的应用之一,接下来我们会继续讲解配置文件相关用法 有关Spring Boot更多系统配置项请查看官网,在需要时我们直接查看即可,不需要背下来
Spring Boot 配置⽂件主要分为以下两种格式:
.properties
.yml
如下图所示:

这两种配置文件其实在作用上别无二致,只不过是两个时代的产物罢了。.properties是比较老的一种格式,而.yml是比较新的一种格式。
注意:
1. 理论上讲 properties 可以和 yml ⼀起存在于⼀个项目当中,当 properties 和 yml ⼀起存在⼀个项⽬中时,如果配置⽂件中出现了同样的配置,⽐如 properties 和 yml 中都配置了“server.port”,那 么这个时候会以 properties 中的配置为主,也就是 .properties 配置⽂件的优先级最高,但加载完 .properties ⽂件之后,也会加载 .yml⽂件的配置信息。
2. 虽然理论上来讲 .properties 可以和 .yml 共存,但实际的业务当中,我们通常会采取⼀种统⼀的配 置⽂件格式,这样可以更好的维护(降低故障率)。
3.配置文件必须是以application命名。这里体现了Spring Boot约定大于配置的思想(Spring Boot相比Spring需要配置的东西少了很多,因为更多的东西是通过约定而简化了)。类似的还有需要托管到Spring Boot的对象必须要放在Spring Boot启动类的根路径或者子路径下才能被框架识别。这里我们不需要像Spring一样去配置xml文件就是因为我们已经约定好了Spring Boot的扫描路径。
IDEA 社区版安装 Spring Assistant 插件之后,就可以正常创建 Spring Boot 项⽬了,并且 yml 的配置 ⽂件就有提示了。但默认情况下是不⽀持 properties 格式的日志提示的,这个时候需要安装了 Spring Tools 插件才会有相应的提示。但是该插件目前仅支持2020及以前的版本,所以大家有能力的可以自行去安装IDEA教育版或者专业版,可以省去安装许多插件的烦恼。
大家初次配置properties文件时,如果输入了中文,在重启idea后可能就会发现中文消失或者变成了乱码。这是因为properties文件的编码格式默认并不是UTF-8,所以需要我们去手动更改。
首先我们进入设置:

接下来进入编辑器->文件编码设置下面将这三个选项全部改成UTF-8即可。
然后还需要进入新项目设置再重复一次上述步骤。

最后将原来的properties文件删除再重新创建即可(因为原来文件的编码格式已经无法更改,只能删除重建)。
properties 是以键值的形式配置的,key 和 value 之间是以“=”连接的,如:
- # 系统的配置文件
- server.port=8081
- spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8mb4&useSSL=true
- spring.datasource.name=root
- spring.datasource.password=123456
- # 自定义配置项
- bilibili.token=xxx
- mybilibili.token=xxx
- bilibili_token=xxx
同时我们可以注意到除了系统的配置文件我们也可以自定义配置项,这个在我们使用一些软件的接口时会用到。
如果在项⽬中,想要主动的读取配置⽂件中的内容,可以使用 @Value 注解来实现。
@Value 注解使⽤“${}”的格式读取,如下代码所示:
- @Controller
- public class UserController {
-
- @Value("${server.port}") // 读取配置项
- private String port;
-
- @ResponseBody // 返回一个非静态页面的数据
- @RequestMapping("/test") // 设置路由地址
- public String Test() {
- return "port:" + port;
- }
- }
这样我们就可以在页面上来读取到我们的端口号信息了。
properties 配置是以 key-value 的形式配置的,如下图所示:

但是我们可以发现其实有很多信息是冗余的:

想要解决这个问题,就可以使⽤ yml 配置⽂件的格式化了。
yml 是 YMAL 是缩写,它的全称 Yet Another Markup Language 翻译成中⽂就是“另⼀种标记语⾔”。 yml 是⼀个可读性⾼,易于理解,⽤来表达数据序列化的格式。它的语法和其他⾼级语⾔类似,并且可 以简单表达清单(数组)、散列表,标量等数据形态。
1.写法简单,可读性高
2.支持更多数据类型(比如对象)
3.跨语言使用(Java/Go/Python等)
其中跨语言是yml最大的优势,他使得运维人员不需要同时维护多个不同语言的配置文件 。
yml 是树形结构的配置⽂件,它的基础语法是“key: value”,注意 key 和 value 之间使⽤英⽂冒号加空格的⽅式组成的,其中的空格不可省略。

这里似乎是因为专业版的原因所以会标红报错,社区版貌似并没有提示,大家请注意。
- spring:
- datasource:
- url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8
- username: root
- password: 123456
可以看到yml因为采用了树形结构,相比properties它大大减少了代码冗余。
4.3.1 yml 配置不同数据类型
- # 字符串
- string.value: Hello
- # 布尔值,true或false
- boolean.value: true
- boolean.value1: false
- # 整数
- int.value: 10
- int.value1: 0b1010_0111_0100_1010_1110 # ⼆进制
- # 浮点数
- float.value: 3.14159
- float.value1: 314159e-5 # 科学计数法
- # Null,~代表null
- null.value: ~
此处语法与properties读取配置完全一致,@Value 注解使⽤“${}”的格式读取,请参考前文的代码。这里不再重复说明。
字符串默认不⽤加上单引号或者双引号,如果加英⽂的单双引号可以表示特殊的含义。
我们看到下面的代码:
- string:
- str1: Hello\nWorld
- str2: 'Hello\nWorld'
- str3: "Hello\nWorld"
我们将他读取出来并打印:
从上述结果可以看出:
1.字符串默认不⽤加上单引号或者双引号。
2.单引号会转义特殊字符,特殊字符最终只是⼀个普通的字符串数据。
3.双引号不会转义字符串⾥⾯的特殊字符;特殊字符会作为本身想表示的意思。
不同于properties,在yml中是支持对象的。如下面配置。
- student:
- id: 1
- name: 张三
- age: 18
也可以使用行内写法(与上面下用法一致,根据个人习惯选择即可)
student: {id: 2,name: 李四,age: 20}
这个时候就不能⽤ @Value 来读取配置中的对象了,此时要使⽤另⼀个注解 @ConfigurationProperties 来读取,具体实现如下:
- @Data
- @ConfigurationProperties(prefix = "student")
- @Component
- public class StudentComponent {
- private int id;
- private String name;
- private int age;
- }
注意此处我们使用了@Data注解。
@Data注解是lombok.jar包下的注解,该注解通常用在实体bean上,不需要写出set和get方法,但是具备实体bean所具备的方法,简化编程提高变成速度。
@Data相当于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集。
如果不使用@Data注解的话我们还需要写出get和set以及tostring方法。
调⽤类的实现如下:
- @Component
- public class ReadYml2 {
- @Autowired
- private StudentComponent studentComponent;
- @PostConstruct
- public void postConstruct() {
- System.out.println(studentComponent);
- }
- }
@Component 在 Spring Boot 启动时候会注⼊到框架中,注⼊到框架中时会执⾏ @PostConstruct 初 始化⽅法,这个时候就能读取到配置信息了。
该注解的方法在整个Bean初始化中的执行顺序:
Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)
运行结果如下:
![]()
- dbtypes:
- name:
- - mysql
- - sqlserver
- - db2
也可以使用行内写法
dbtypes: {name: [mysql,sqlserver,db2]}
集合的读取和对象⼀样,也是使⽤ @ConfigurationProperties 来读取的,具体实现如下:
- @Component
- @ConfigurationProperties("dbtypes")
- @Data
- public class ListConfig {
- private List
name; - }
打印类如下:
- @Component
- public class ReadYml {
- @Autowired
- private ListConfig listConfig;
- @PostConstruct
- public void postConstruct() {
- System.out.println(listConfig.getName());
- }
- }
结果如下:
![]()
1.roperties 是以 key=value 的形式配置的键值类型的配置⽂件,而 yml 使用的是类似 json 格式的 树形配置⽅式进⾏配置的,yml 层级之间使⽤换行缩进的⽅式配置,key 和 value 之间使⽤“: ”英⽂ 冒号加空格的⽅式设置,并且空格不可省略。
2.properties 为早期并且默认的配置⽂件格式,但其配置存在⼀定的冗余数据,使⽤ yml 可以很好的 解决数据冗余的问题。
3.yml 通用性更好,⽀持更多语⾔,如 Java、Go、Python 等,如果是云服务器开发,可以使⽤⼀份 配置⽂件作为 Java 和 Go 的共同配置⽂件。
4.yml 虽然可以和 properties 共存,但⼀个项⽬中建议使⽤统⼀的配置类型⽂件。