1. 配置文件的作用
配置文件主要是为了解决硬编码带来的问题, 把可能会发生改变的信息,放在⼀个集中的地方, 当我们启动某个程序时, 应用程序从配置文件中读取数据, 并加载运行。
- 硬编码是将数据直接嵌入到程序或其他可执行对象的源代码中, 也就是我们常说的"代码写死"。
- 比如手机字体大小
- 如果采用硬编码的⽅式, 就直接在程序中指定字体大小, 所有的用户使用的都是同⼀个字体大小
- 但是不同的用户有不同的偏好, 我们可以把手机字体的大小放在配置文件中, 当程序启动时, 读取配置, 以用户设置的字体大小来显示。
使用配置文件, 可以使程序完成用户和应用程序的交互,或者应用程序与其他应用程序的交互。
2. SpringBoot 配置文件
SpringBoot支持并定义了配置文件的格式,也在另⼀个层面达到了规范其他框架集成到SpringBoot的目的。
很多项目或者框架的配置信息也放在配置文件中,比如:
- 项目的启动端⼝
- 数据库的连接信息(包含用户名和密码的设置)
- 第三方系统的调用密钥等信息
- 用于发现和定位问题的普通日志和异常日志等
项目的启动端口 :SpringBoot内置了Tomcat服务器, 默认端⼝号是8080,但是用户电脑上8080端口号有可能就被其他应用程序占用了, 所以SpringBoot需要支持让用户自定义端⼝号
数据库连接信息 :为了更方便简单的访问数据库,出现了⼀些持久层框架, 其实就是对JDBC进行了更深层次的封装.让用户通过简单几行代码就可完成数据库的访问。但是不同的应用程序访问的数据库不同, 这些持久层框架就需要支持用户可以自定义配置数据库的连接信息。
可以通过配置文件来修改服务的端口号。
SpringBoot 在创建项目时, 就已经帮我们创建了配置文件:

修改 application.properties 文件:

重新运行程序, 观察日志:显示Tomcat启动端口号为9090

3. 配置文件格式
Spring Boot 配置文件有以下三种:
- application.properties
- application.yml
- application.yaml
yml 为yaml的简写, 实际开发中出现频率最高,yaml 和yml 的使用方式⼀样。
当应用程序启动时, Spring Boot会自动从classpath路径找到并加载 application.properties 和 application.yaml 或者 application.yml 文件。
说明:
- 理论上讲,.properties 和 .yml 可以并存在于⼀个项目中 ,当 .properties 和 .yml 并存时,两个配置都会加载,如果配置文件内容有冲突, 则以 .properties 为主 , 也就是 .properties 优先级更高
- 虽然理论上来讲,.properties 可以和 .yml 共存,但实际的业务当中,我们通常会采取⼀种统⼀的配置文件格式,这样可以更好的维护(降低故障率)。

4. properties 配置文件说明
① 基本语法
properties 是以键值的形式配置的,key 和 value 之间是以 "=" 连接的,key 的所有单词小写,单词之间使用 点(.) 来分割,如:

② 读取配置文件
如果在项目中,想要主动的读取配置文件中的内容,可以使用 @Value 注解来实现。
@Value 的作用:用于将单个配置项、系统属性、环境变量或 SpEL 表达式的值,注入到 Bean 的字段、方法参数或构造器参数中。
@Value 注解使用 " ${} " 的格式读取,如下代码所示:

访问:http://127.0.0.1:9090/properties/read

③ properties 缺点分析
properties 配置是以 key-value 的形式配置的,如下图所示:

从上述配置key看出,properties 配置文件中会有很多的冗余的信息,比如这些:

想要解决这个问题,就可以使用 yml 配置文件的格式化了。
5. yml 配置文件说明
yml 是 YAML 是缩写,它的全称 Yet Another Markup Language 翻译成中文就是"另⼀种标记语言我们先来学习yml的语法
① 基本语法
yml 是树形结构的配置⽂件,它的基础语法是 "key: value".
key 和 value 之间使用英文冒号加空格的方式组成,空格不可省略。
基础语法如下:

使用 yml 连接数据库:

和 properties 连接数据库的配置对比,去掉了一些冗余信息。
② yml 使用
yml 配置不同数据类型及null

③ 读取配置文件
yml 读取配置的方式和 properties 相同,使用 @Value 注解即可,实现代码如下:
yml 配置:

@PostConstruct
为了方便观察,这里介绍一个注解 @PostConstruct ,@PostConstruct 的作用是:标记一个初始化方法,让容器在依赖注入完成后、Bean 正式使用前自动调用一次。即 @PostConstruct 在构造方法之后、依赖注入之后、Bean 正式使用之前执行。
Spring 创建一个 Bean,大概做这几件事:
-
- 调用构造方法,new 出对象
-
- 给对象注入依赖(@Autowired、setter 等)
-
- 调用 @PostConstruct 方法
-
- 再调用其他初始化方法(如果有)
-
- Bean 准备完毕,可以被别人使用了
读取 yml 文件:

运行结果:
- 构造方法 -> 依赖注入 -> @PostConstruct -> 整个应用启动完成

注意事项:value 值加单双引号
字符串默认不用加上单引号或者双引号,如果加英文的单双引号可以表示特殊的含义。
尝试在 application.yml 中配置如下信息:

读取:


从上述结果可以看出:
- 字符串默认不用加上单引号或者双引号。
- 单引号会转义特殊字符,使其失去特殊功能, 始终是⼀个普通的字符串.
- 双引号不会转义字符串里面的特殊字符, 特殊字符会表示本身的含义.
④ 配置对象
在 yml 中配置对象:

写法和获取属性一样,只是不再是使用 @Value 注解来读,而是使用另⼀个注解 @ConfigurationProperties 来读取。
作用:把配置文件中,某个前缀下的所有配置项,一次性自动绑定到一个 Java Bean 的属性上。
@ConfigurationProperties 中prefix 属性的作用:让 Spring Boot 去配置文件里找以这个前缀开头的所有属性,把它们批量绑定到当前类的字段上,不可省略。
将配置文件中 person 对象的属性批量绑定到 Person 类中的属性上,让该类中的属性赋上配置文件中对应属性的值:

然后将Person类进行依赖注入,读取配置文件中的person对象:


⑤ 配置集合
配置文件也可以配置 list 集合,如下所示:

集合的读取和对象⼀样,也是使用 @ConfigurationProperties 来读取的,具体实现如下:

读取集合:


【配置集合和配置数组的方式是一样的,只需要将List类换成一个数据即可】
⑥ 配置Map



⑦ yml 优缺点
优点:
- 可读性高,写法简单, 易于理解
- 支持更多的数据类型, 可以简单表达对象, 数组, List,Map等数据形态.
- 支持更多的编程语言, 不止是Java中可以使用, 在Golang, Python, Ruby, JavaScript中也可以使用
缺点:
- 不适合写复杂的配置文件
- 对格式有较强的要求