目录
1. 配置文件作用
2. 配置文件格式
3. properties 配置文件说明
3.1 properties 基本语法
3.2 读取配置文件
3.3 缺点
4. yml 配置文件说明
4.1 properties 基本语法
4.2 读取配置文件
4.3 yml 配置不同的数据类型
布尔值
整数值
null 值
配置对象
配置集合
配置 Map
Banner
多平台的文件配置
4.4 优点
5 properties VS yml
1. 配置文件作用
整个项目中所有重要的数据都是在配置文件中配置的,比如:
- 数据库的连接信息(包含用户名和密码的设置);
- 项目的启动端口;
- 第三方系统的调用秘钥等信息;
- 用于发现和定位问题的普通日志和异常日志等。
如果没有配置信息,那么 Spring Boot 项目就不能连接和操作数据库,甚至不能保存可以用于排查问题的关键日志,所以配置文件的作用是非常重要的。
2. 配置文件格式
Spring Boot 配置文件主要分为以下两种格式:
- .properties
- .yml
properties 类型的配置文件属于“旧款”,是创建 Spring Boot 项目时默认的文件格式;而 yml 属于新版款式,如果用户需要新款则使用新款。
1. 理论上讲 properties 可以和 yml ⼀起存在于⼀个项目当中,当 properties 和 yml ⼀起存在于⼀个项目中时,如果配置文件中出现了同样的配置,比如 properties 和 yml 中都配置了“server.port”, 那么这个时候会以 properties 中的配置为主,也就是 .properties 配置文件的优先级最高,但加载完 .properties 文件之后,也会加载 .yml 文件的配置信息。
2. 虽然理论上来讲 .properties 可以和 .yml 共存,但实际的业务当中,我们通常会采取一种统一的配置文件格式,这样可以更好的维护(降低故障率)。
3. properties 配置文件说明
properties 配置文件是最早期的配置文件格式,也是创建 Spring Boot 项目默认的配置文件。
配置文件包括:
- Spring 的配置
- 自定义配置
3.1 properties 基本语法
properties 是以键值的形式配置的,key 和 value 之间是以“=”连接的,如:
# 配置项目端口号
server.port=9090
# 数据库配置信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root# 自定义配置
mykey.key1=aaa
key (= 前面)只要是字符串就可以。 但是规范为:全部小写,单词之间使用 . 分割。
一般来说,类名:首字母大写(大驼峰)
变量名:首字母小写(小驼峰)
常量:全大写,单词之间使用_分割
3.2 读取配置文件
如果在项目中,想要主动的读取配置文件中的内容,可以使用 @Value 注解来实现。
@Value 注解使用“${}”的格式读取,如下代码所示:
@RestController
public class ValueController {@Value("${mykey.key1}")private String key1;@PostConstructpublic void postConstruct(){System.out.println("===========================");System.out.println("key:" + key1);}public String hi(){return "hi~ ValueController...";}
}
我们通过 @Value 获取自定义的配置文件中的值。
如果我们去掉 ${},那么可以看到最终结果直接将双引号里面的值赋值给了 key1 变量:
@RestController 在Spring Boot 启动时会注入到框架中,注入到框架中时会执行 @PostConstruct 初始化方法,此时就能读取到配置信息了。
3.3 缺点
properties 配置是以 key-value 的形式配置的,因此配置文件中会有很多的冗余的信息。
4. yml 配置文件说明
yml 是 YAML 是缩写,它的全称 Yet Another Markup Language 翻译成中文就是“另⼀种标记语 言”。
4.1 properties 基本语法
yml 是树形结构的配置⽂件,它的基础语法是“key: value”,注意 key 和 value 之间使用英文冒号加空格的方式组成的,其中的空格不可省略。
server:port: 8080
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8username: rootpassword: root
4.2 读取配置文件
同样通过@Value 注解使用“${}”的格式读取:
@RestController
public class ValueController {@Value("${spring.datasource.username}")private String sqlusername;@PostConstructpublic void postConstruct(){System.out.println("===========================");System.out.println("sqlusername:"+sqlusername);}public String hi(){return "hi~ ValueController...";}
}
4.3 yml 配置不同的数据类型
布尔值
mykey:key1: true
整数值
mykey:key1: 10
null 值
mykey:key1: ~
对于单引号和双引号的区别:
String:str1: Hello \n Spring Boot.str2: 'Hello \n Spring Boot.'str3: "Hello \n Spring Boot."
配置对象
Student:id: 1name: dannyage: 18
public class Student {private Integer id;private String name;private Integer age;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}
我们可以看到直接写上面一个类非常麻烦,需要加入 get 和 set 方法,因此,我们可以通过添加注解 @Data 来帮助我们直接写 get 和 set 方法,以及 toString 方法,还有一些构造函数。
@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {private Integer id;private String name;private Integer age;
}
通过五大注解接收对象,将对象存放至 Spring 中,此处使用 @Component 注解;
通过 @ConfigurationProperties(prefix = "student") 将 yml 文件中的 Student 赋值给这个对象(“prefix =”可以省略),此处的 student 首字母要小写。
@RestController
public class ValueController {@Autowiredprivate Student student;@PostConstructpublic void postConstruct(){System.out.println("===========================");System.out.println(student);System.out.println("===========================");}public String hi(){return "hi~ ValueController...";}
}
配置集合
Student:id: 1name: dannyage: 18dbtypes:- mysql- sqlserver- db2
@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {private Integer id;private String name;private Integer age;private List<String> dbtypes;
}
配置 Map
Student:id: 1name: dannyage: 18dbtypes:- mysql- sqlserver- db2map2:k1: kk1k2: kk2k3: kk3
@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {private Integer id;private String name;private Integer age;private List<String> dbtypes;private Map<String,String> map2;
}
Banner
我们可以通过在线工具直接生成 banner:Spring Boot banner在线生成工具,制作下载英文banner.txt,修改替换banner.txt文字实现自定义,个性化启动banner-bootschool.netSpring Boot banner工具实现在线生成banner,轻松修改替换实现自定义banner,让banner.txt文件内容更有趣,是很棒的Spring Boot banner自定义和命令行ascii文字工具,还可以生成linux、MAC各系统命令行终端ascii文字,有了它你的项目会变得有意思。https://www.bootschool.net/ascii
我们选择下载文件,将下载好的文件命名为 banner.txt 粘贴在 idea 的 resource 文件夹下:
重新运行程序,可以看到此时生成的是我们刚刚设置的文件:
多平台的文件配置
实际工作中的开发环境分为开发环境(自测)、测试环境(测试人员进行测试,测试环境的数据都是测试人员/开发人员造的数据,是假数据)、预发布环境和发布环境(通常数据是一样的,都是线上真实的用户数据)。
我们希望在不同的配置环境中执行不同的配置文件,因此将主文件中的配置注释,并进行设置:
@RestController
public class ValueController {@Value("${spring.datasource.username}")private String sqlusername;@Value("${spring.datasource.password}")private String password;@Autowiredprivate Student student;@PostConstructpublic void postConstruct(){System.out.println("===========================");System.out.println("sqlusername:"+sqlusername);System.out.println("password:"+password);System.out.println("===========================");}public String hi(){return "hi~ ValueController...";}
}
设置为 test 环境下:
设置为 prod 环境下:
综上,多平台文件配置的步骤可以总结如下:
- 先写各个环境的配置文件:application-xxx.yml
- 在主配置文件 application.yml 中设置环境参数
4.4 优点
yml 的优点:
- yml 可读性高,写法简单、易于理解,它的语法和 JSON 语言类似。
- yml 支持更多的数据类型,它可以简单表达清单 (数组)、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件等。
- yml 支持更多的编程语言,它不止是 Java 中可以使用,在 Golang、PHP、Python、Ruby、JavaScript、Perl 中同样可以使用。
5 properties VS yml
- properties 是以 key=value 的形式配置的键值类型的配置⽂件,而 yml 使用的是类似 json 格式的树形配置方式进行配置的,yml 层级之间使用换行缩进的方式配置,key 和 value 之间使用“: ”英文冒号加空格的方式设置,并且空格不可省略。
- properties 为早期并且默认的配置文件格式,但其配置存在一定的冗余数据,使用 yml 可以很好的解决数据冗余的问题。
- yml 通用性更好,支持更多语言,如 Java、Go、Python 等,如果是云服务器开发,可以使⽤⼀份配置文件作为 Java 和 Go 的共同配置文件。
- yml 支持更多的数据类型。
当我们关闭再打开 idea,可以看到 .properties 文件出现了乱码:
因为它的格式为:
而 .yml 文件的格式为:
因此需要修改 .properties 文件的格式:
之后再打开 .properties 文件不会再出现乱码。