Spring Boot 配置文件
引言
配置文件的作用
一个 Spring Boot 项目中所有重要的数据都是在配置文件中配置的,例如:
- 数据库的连接信息,包含用户名和密码的设置
- Spring Boot 项目的启动端口
- 第三方系统的调用秘钥信息
- 用于发现和定位问题的日志打印
想象一下,如果没有配置信息,那么 Spring Boot 项目就不能连接和操作数据库,甚至不能保存可以用于排查问题的关键日志。所以配置文件的作用是非常重要的。
一、Spring Boot 配置文件的格式
1. properties ( 老版本)
2. yml ( 新版本 )
注意
1. 理论上说,一个 Spring Boot 项目可以同时使用 " properties " 和 " yml " 配置文件,但不建议一个项目中出现两种配置文件,因为这就是一种规范。 试想,当一个公司在处理一个项目时,一批人用了前者,一批人用了后者,这就比较混乱,若不能实现代码的统一,就很可能出现差错。
2. 如果一个 Spring Boot 项目中真的同时使用了上述的两种配置文件,那么最终配置项就会以 " properies " 为主,从而忽略了 " yml ".
二、配置文件的分类
1.系统的配置文件。
比如数据库连接、日志的相关设置,这些都是框架已经提供好的固定写法。
2. 用户自定义的配置文件。
我们可以自己设置一些想要的配置,但一般很少。因为我们使用 Spring Boot 最多的无非就是 Web 开发,也就是做一个网页的后端,很多东西都是固定的,所以一般来说,使用系统配置好的即可。
三、properties 文件
当我们成功创建一个 Spring Boot 项目后,properties 文件就会自动生成在【resources】目录下。
1. properties 文件的配置语法
properties 的语法和 Map 键值对很类似。
它的注释是 " # ",就相当于 Java 中的 " // ".
例如,我通过 properties 文件,对数据库进行一些配置,重新设置端口号,并尝试与本地数据库建立连接。
# 系统配置文件
server.port=9090
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/database?characterEncoding=utf8&&useSSL=false
spring.datasource.name=root
spring.datasource.password=12345
# 自定义配置文件
string1=abc
string2=123
当我们配置好文件后,重新运行启动类,Tomcat 端口号就会直接被改变,那么,当我们使用浏览器发送 HTTP 请求的时候,就不再是 " 8080 " 了,而是当前的 " 9090 ".
2. 注意事项
(1) properties 文件的语法是键值对结构,即 " key=value “,在我们日常写入配置的时候,” = " 的左右不应该留有空格,如:" server.port = 9090 ",这样写是不规范的,因为,有空格就可能会出错,它并不像 Java 代码一样,编译器能够为我们审核。此外,9090 的后面也不应该加上空格。
(2) 实际上,properties 文件,在 IDEA 社区版,Java 并不会为我们实现语法补全,我们需要自己添加插件,但是本人试了好几个插件都没有解决问题,可能是因为自己 IDEA 版本有问题。小伙伴可以自己试一试类似于 " Spring Tools " 这种插件,如果最终解决了最好,如果解决不了也没关系,虽然没有语法补全,但是,常用的与 Web 开发相关的系统配置文件就那么多,多写几遍就能记住了。
(3) 如果 properties 文件的注释出现乱码了,需要通过 IDEA 将当前项目和新创建的项目的全部编码设置为 UTF-8.
3. 读取配置文件
我们创建一个 " UserController2 " 类,在里面写入如下代码:
@ControllerpublicclassUserController2{@Value("${server.port}")privateString port;@ResponseBody@RequestMapping("/hello2")publicStringhello(){return"port = "+ port;}}
运行启动类,打开浏览器输入 URL:
对于上面的格式进行说明:
@Value("${server.port}")privateString port;
第一行代码 " @Value(${ }) " 这是一种固定写法,表示一次性读取单个的配置项。如果我们需要读多个配置项,那就多写几个这样的注解。
第二行代码,就是将刚刚的配置项赋予一个新的成员变量,类似于对象注入。
4. properties 文件的缺点分析
就拿与数据库进行连接操作时,使用的代码来看,代码较为冗余,当我们设置数据库地址、用户、密码的时候,都需要包含 " spring.datasource " 这个前缀,此外,社区版 IDEA 若没有代码补全功能的话,使用起来体验感还是很差的。
spring.datasource.url=
spring.datasource.name=
spring.datasource.password=
四、yml 文件
当我们成功创建一个 Spring Boot 项目后,yml 文件并不会自动生成,所以,我们应该自己创建一个 yml 文件,放在 【resources】目录下。
1. 注意事项
在上面创建 yml 文件的前后,有三个地方需要注意。
(1) 创建 yml 文件的统一名称为 " application.yml ",这是一种规范,Spring Boot 框架只认识这个特殊的名字,如果换成别的名字,就会出错。
(2) 创建好 yml 文件后,我们需要将 properties 文件下的代码都注释掉,以防最终框架忽略了 yml 的代码。
(3) 创建好 yml 文件后,社区版 IDEA 会为我们自动生成 [ 语法补全和语法高亮 ] 的功能,并不需要我们额外添加插件。
2. yml 文件的配置语法
yml 的语法,有效地解决了 properties 文件代码冗余的缺点,它的代码结构与树形结构很相似,共同的部分不需要重复写。
# 系统的配置文件
server:
port:8090
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/oj_database?characterEncoding=utf8&&useSSL=false
name: root
password:12345
重新配置的 Tomcat 端口:
3. 语法需要注意的问题
它的基础语法是 " key: value ",由 key 和 value 之间的冒号加空格的方式组成的,其中的空格不可省略。
4. 读取单个配置项
" @Value " 注解读取普通数据
虽然 yml 文件中的配置语法是通过 " : " 的方式进行配置的,但当我们利用注解读取配置文件的时候,还是用 " . " 的方式读取到某个特定的配置项。
@ControllerpublicclassUserController2{@Value("${server.port}")privateString port;@ResponseBody@RequestMapping("/hello2")publicStringhello(){return"port = "+ port;}}
运行启动类,打开浏览器输入 URL:
" @Value " 注解读取单双引号字符串
yml 配置文件:
# 自定义配置文件
string1: hello\nworld
string2: 'hello\nworld'
string3:"hello\nworld"
创建一个 " UserController3 " 类,利用 " @Value " 注解读取上面的三个自定义配置项,代码如下所示:
@ControllerpublicclassUserController3{@Value("${string1}")privateString sting1;@Value("${string2}")privateString sting2;@Value("${string3}")privateString sting3;@ResponseBody@RequestMapping("/hello3")publicStringhello(){System.out.println(sting1);System.out.println(sting2);System.out.println(sting3);return sting1 +" | "+ sting2 +" | "+ sting3;}}
IDEA 打印日志和抓包结果:
前端展示结果:
因为 HTML 的换行是 br 标签,所以在这里它并没有实质性的换行。
从上面的展示结果来看,我们可以得出结论:
1. yml 配置文件中的字符串,默认不用加上单引号或双引号。
2. 单引号会对字符串中的特殊字符进行转义。( 比如:" \n " -> " \n " )
3. 双引号不会转义字符串里面的特殊字符,字符串仍旧表达原语义。
5. yml 文件的对象的配置和读取
yml 文件的对象配置写法有两种,代码如下:
# 配置对象 1
student1:
id:1
name: 杰克
age:20
# 配置对象 2
student2:{ id:2, name: 露丝, age:18}
创建一个 Student 类,并对类进行注解," @Data " 注解是由 lombok 提供的,它包含了 " Getter、Setter、equals " 等众多方法,所以虽然我们在下面为字段设置了 private 限定符,但在外面的类,依然能够拿到对应值。代码如下:
@Data@Component// 不能省略@ConfigurationProperties(prefix ="student1")// 读取配置文件中的对象publicclassStudent{privateint id;privateString name;privateint age;}
创建一个 " UserController4 " 类,以属性注入的方式进行 Student 对象注入,并给前端返回一个字符串数据。代码如下:
@ControllerpublicclassUserController4{@AutowiredprivateStudent student;@ResponseBody@RequestMapping("hello4")publicStringhello(){return student.toString();}}
展示结果:
上面的是读取配置文件中的 student1 对象,如果我们需要读取 student2 对象,只需对 Student 的下面注解进行修改即可。
@ConfigurationProperties(prefix ="student2")
6. yml 文件的集合的配置和读取
yml 文件的集合配置写法有两种,代码如下:
# 配置集合 1
gather1:
language:- HTML
- CSS
- JS
# 配置集合 2
gather2:{ language:[C,C++,Java]}
创建一个 ReadGather 类,并对类进行注解,细节部分我就不不展开说了,它和对象的配置项思路很相似。
@Data@Controller@ConfigurationProperties(prefix ="gather2")publicclassReadGather{privateList<String> language;}
创建一个 " UserController5 " 类,以属性注入的方式进行 ReadGather 对象注入,并给前端返回一个字符串数据。代码如下:
@ControllerpublicclassUserController5{@AutowiredprivateReadGather readGather;@ResponseBody@RequestMapping("/hello5")publicStringhello5(){return"gather: "+ readGather.getLanguage();}}
展示结果:
五、更多的官方配置项
Spring Boot 常用的系统配置项,随着我们学习的深入,多写几遍就能记住,如果万一我们记不住了,或想要查看系统更多的配置项,我们就可以访问官网:
https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties
六、对比 properties 和 yml
1. properties 是以 " key=value " 的形式配置文件, yml 使用的是类似 json 格式的树形配置方式进行配置的,yml 层级之间使用换行缩进的方式配置,key 和 value 之间使用冒号加空格的方式设置,并且空格不可省略。
2. properties 为早期默认的配置文件格式,但其配置存在一定的冗余数据,yml 算是 properties 的新版本,它可以很好地解决数据冗余的问题。此外,yml 写法更简单、可读性更高,并支持更多的数据类型。
3. yml 的通用性更好,支持更多语言,例如 Java、Go、Python 等。如果是云服务器开发,项目可以使用同一份配置文件作为多种语言的共同配置文件。这是 yml 的一个很大的特点,它有利于不同开发人员做的同一个项目。
4. yml 虽然可以和 properties 共存,但一个项目中建议只使用其中一种。
版权归原作者 十七ing 所有, 如有侵权,请联系我们删除。