一、配置文件的作用
计算机上有数以千计的配置文件,我们使用的绝大多数软件,比如浏览器、微信、IDEA、Git、甚至手机都离不开配置文件。配置文件主要是为了解决硬编码带来的问题,硬编码是将数据直接嵌入到程序或其他可执行对象的源代码中,也就是我们常说的'代码写死',把可能会发生改变的信息,放在一个集中的地方,当我们启动某个程序时,应用程序从配置文件中读取数据,并加载运行。比如说,我们在 IDEA 的设置里面修改字体的样式、大小、间距等。
Spring Boot 配置文件用于解决硬编码问题,支持 properties 和 yml/yaml 格式。properties 为键值对形式,存在冗余且中文注释易乱码;yml 为树形结构,可读性强且支持复杂数据类型,但对格式敏感。可通过 @Value 或 @ConfigurationProperties 注解读取配置。

计算机上有数以千计的配置文件,我们使用的绝大多数软件,比如浏览器、微信、IDEA、Git、甚至手机都离不开配置文件。配置文件主要是为了解决硬编码带来的问题,硬编码是将数据直接嵌入到程序或其他可执行对象的源代码中,也就是我们常说的'代码写死',把可能会发生改变的信息,放在一个集中的地方,当我们启动某个程序时,应用程序从配置文件中读取数据,并加载运行。比如说,我们在 IDEA 的设置里面修改字体的样式、大小、间距等。

SpringBoot 支持并定义了配置文件的格式,也在另一个层面达到了规范其他框架集成到 SpringBoot 的目的。很多项目或者框架的配置信息也放在配置文件中,比如:项目的启动端口、数据库的连接信息。
SpringBoot 内置了 Tomcat 服务器,默认端口是 8080。但是用户电脑上 8080 端口号有可能就被其他应用程序占用了,所以 SpringBoot 需要支持让用户自定义端口号。SpringBoot 在创建项目时,就已经帮我们创建了配置文件。我们可以通过 application.properties 文件修改启动端口号,当我们再次启动这个 SpringBoot 项目时,就需要通过该配置生效。
server.port=8081


SpringBoot 的配置文件有以下三种:
yml 是 yaml 的简写,使用方式一样,是一种类似 html 的文件,实际开发中频率最高。
server:
port: 8082

当应用程序启动时,SpringBoot 会自动从 classpath 路径中找到并加载配置文件。同一个配置项,如果 properties 和 yml 同时配置了,properties 优先级更高。
properties 配置文件是最早期的配置文件格式,也是创建 SpringBoot 项目默认的配置文件。
properties 是以键值的形式配置的,key 和 value 之间是以"="连接的,如:
# 配置项目端口号
server.port=8080
# 配置数据库连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
如果想要主动的读取配置文件中的内容,可以使用 @Value 注解来实现。注解使用 @Value("${}") 的格式读取,如下代码所示:
package com.yang.test1_30_1;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/prop")
public class PropertiesController {
@Value("${spring.datasource.url}")
private String url;
@Value("${my.key1}")
private Integer key1;
@Value("${my.key2}")
private Boolean key2;
@RequestMapping("/read")
public String readProperties() {
System.out.println(key1);
System.out.println(key2);
return "从配置文件中,读取 url" + url;
}
}
spring.application.name=Test1_30_1
server.port=8081
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
my.key1=5
my.key2=true

properties 配置文件以 key-value(键值对) 形式进行配置,其核心缺点是存在大量冗余信息,具体表现如下:
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
可见配置的 key 中,spring.datasource 这一前缀会重复出现多次,此类重复内容即为冗余信息,增加了配置文件的编写成本与维护复杂度。
还有一点需要注意:如果我们在 application.properties 里面加入了一些中文注释,当我们关闭项目之后再次打开,就会出现乱码。我们只需使用快捷键 ctrl + alt + s 打开 IDEA 的设置,把下面两个地方改成 UTF-8 即可。

yml 是树形结构的配置文件,它的基础语法是 "key: value"。key 和 value 之间使用英文冒号和空格组成,并且空格不能省略。
# 单层 yaml
yaml:
aa: hello
# 多层 yaml
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/testdb?
username: root
password: root
# 字符串
string.value: Hello
# 布尔值
boolean.value1: true
boolean.value2: false
# 整数
int.value: 10
# 浮点数
float.value: 3.14
# Null
null.value: ~
获取配置的方式与 properties 的方式一样,都是使用 @Value 注解。
package com.yang.test1_31_1;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/yaml")
@RestController
public class YamlController {
@Value("${yaml}")
private String yaml;
@Value("${spring.datasource.username}")
private String username;
@RequestMapping("/read")
public String read() {
System.out.println(yaml);
System.out.println(username);
return "success";
}
}
student:
id: 1
name: John
age: 21
这里想要获取配置,需要使用另外一个注解 @ConfigurationProperties 来读取。
package com.yang.test1_31_2;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationProperties(prefix = "student")
@Data
public class Student {
private Integer id;
private String name;
private Integer age;
}
package com.yang.test1_31_2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/yaml")
@RestController
public class TestController {
@Autowired
private Student student;
@RequestMapping("/read")
public void read() {
System.out.println(student);
}
}

集合的读取和对象的方式一样。
dbtypes:
name:
- mysql
- sqlserver
- db1
package com.yang.test1_31_3;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.List;
@Configuration
@ConfigurationProperties(prefix = "dbtypes")
@Data
public class DbType {
private List<String> name;
}
package com.yang.test1_31_3;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/yaml")
public class TestController {
@Autowired
private DbType dbType;
@RequestMapping("/read")
public String read() {
System.out.println(dbType);
return "success";
}
}

maptypes:
map:
k1: aaa
k2: bbb
k3: ccc
package com.yang.test1_31_4;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.Map;
@Configuration
@ConfigurationProperties(prefix = "maptypes")
@Data
public class MapConfig {
private Map<String, String> map;
}
package com.yang.test1_31_4;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/yaml")
public class TestController {
@Autowired
private MapConfig mapConfig;
@RequestMapping("/read")
public String read() {
System.out.println(mapConfig);
return "success";
}
}
一、优点
二、缺点

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online