前言:
本系列博客记录 springboot 求学之路:
一般你去看稍微新点的springboot工程,它的资源配置文件都是 yml,而不是自带的 properties;一方面是 yml 文件书写格式比较清晰简洁(和 python 书写格式很像),另一方面多种环境(测试、开发、生产等)配置也方便。
1.properties 文件使用
毕竟是自带的文件嘛,我们先用一下看看效果,然后再丢掉嘛(有点渣,做人不要这样…)
打开 resources 目录下的 application.properties 文件,写入:
server.port=8000
这段意思是指定访问端口 8000(默认值 8080),
对应的接口代码如下:
package com.test.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@GetMapping(path = "/")
public String get() {
return "hello, SpringBoot";
}
}
看下效果
反正就是生效了
2.yml 文件使用
首先,先把 resources 下 application.properties 删了,然后在同一个地方创建 application.yml(文件名字不能错),写入配置:
server:
port: 8000
重新启动一下工程,你会发现通过 8000 端口可以访问,也就是说替换成功了
tips: 这里是比较新的 springboot 版本,如果是旧版本可能出现不生效的情况,是因为旧版本不支持 yml 文件,这时候需要在 pom 里面加入 yaml 依赖,如下:
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.20</version>
</dependency>
3.多个 yml 文件的配置使用
在 resources 下新建 application-test.yml 文件,用途是测试环境,写入配置:
server:
port: 8000
在 resources 下新建 application-pro.yml 文件,用途是生产环境,写入配置:
server:
port: 9000
修改 application.yml 文件配置如下:
spring:
profiles:
active: pro
意思是让 pro 环境(application-pro.yml)生效
这时候再重新运行工程,会发现 9000 端口生效,8000 端口无效
tips:
- 多环境命令一定是 application-xxx.yml,在 application.yml 里面只写 xxx 就行了
- 如果 application.yml 和生效配置文件(上面pro文件)有配置冲突,例如 application.yml 添加端口号配置为 8888,生效配置文件配置覆盖冲突的配置项(pro 文件为准)。
4.yml 文件配置信息读取
首先在 pom 加依赖,
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
实际使用当中,在2.2.6版本没有这个依赖也是可以的,只是在 yml 文件中有黄色高亮告警,在代码里面也会有告警提示,建议加上。
application-pro.yml 配置如下:
server:
port: 9000
person:
age: 28
name: jonny
TestController 改造一下:
package com.test.demo.controller;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@ConfigurationProperties(prefix = "person") // 提示代码所用文件配置的前缀
public class TestController {
private int age; // 对应配置文件的 age,值为整型 28
private String name; // 对应配置文件的 name,值为字符串 jonny
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
@GetMapping(path = "/age")
public int getAge() {
return age;
}
@GetMapping(path = "/name")
public String getName() {
return name;
}
}
tips:
- 代码的属性名称一定要与 yml 里面完全一致
- 一定要有 set 方法,作用就是把 yml 属性的值赋予给类的属性,没有 set 方法没法赋值
- get,set 方法建议用 @Data 注解整个类,依赖如下:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
浏览器测试如下:
5.因版本差异,建议实践确认区别,end