yml 的配置
除了(一)中总结的内容,yml 还有其他的语法,例如可以在 yml 中继续参数引用,例如以下这个例子:
name: Bob
person:
name: ${name}
age: 20
@Value("${person.name}")
private String name;
@Value("${person.age}")
private int age;
@Test
void test2(){
System.out.println(name + ":" + age);
}
运行后输出结果为 Bob:20
。
这说明在 yml 中还可以继续参数引用,person.name 赋值为了 name 的值,也就是 Bob
。
另外,yml 中的数组也可以写成行内数组的格式,例如:
list: [hello,world]
yml 中还有一个重要的知识点,就是纯量。比如现在在 yml 中定义如下参数:
msg1: 'hello\n world' #不会识别转义字符,会原样输出
msg2: "hello\n world" #会识别转义字符
上述参数的唯一区别就是 msg1 使用的是单引号,而 msg2 使用的是双引号,我们编写如下代码进行测试:
@Value("${msg1}")
private String msg1;
@Value("${msg2}")
private String msg2;
@Test
void test3(){
System.out.println(msg1);
System.out.println(msg2);
}
输出结果如下:
hello\n world
hello
world
这说明,如果我们使用单引号引用字符串,那么不会识别转义字符,会原样输出;如果使用双引号,则会识别转义字符。
那么思考一下,如果定义:
msg3: hello\n world
会有什么效果?经过本人实验,效果其实加单引号效果一样,不会识别转义字符。
另外,再补充一点,即使我们不使用 @Value
和 @ConfigurationProperties
这两个注解,也有别的办法在代码中随时获得配置中的参数,我们可以使用 Environment
这个类中的 getProperty(参数名)
即可,例如:
@Autowired
private Environment env; //import org.springframework.core.env.Environment;
@Test
void test4(){
System.out.println(env.getProperty("msg1"));
}
- 参数名直接用字符串形式就可以,不用再加
$
或{}
了。 Environment
导的是org.springframework.core.env.Environment;
不要导入错了。
Profile 的使用
我们在开发 SpringBoot 应用时,通常同一套程序会被安装到不同环境,比如:开发、测试、生产等。其中数据库地址、服务器端口等等配置都不同,如果每次打包时,都要修改配置文件,那么非常麻烦。profile 功能就是来进行动态配置切换的。
多 Profile 文件方式
如下图,我现在新建如下三个 yml 文件:
我在 application-dev.yml
文件中写入:
server:
port: 8082
然后在 application-test.yml
文件中写入:
server:
port: 8081
如果我 application.yml
中什么也不写,运行后结果如下所示:
可以看到当前并没有设置 Profile,并且当前在 8080 端口运行。
那么此时我如果在 application.yml
中写入以下语句:
spring:
profiles:
active: dev
那么运行后的结果如下所示:
可以看到此时的 Profile 被设置了,此时激活的是 dev
,并且发现项目在 8082 端口运行,这说明 application-dev.yml
中的配置生效了,同理我如果将 application.yml
换成:
spring:
profiles:
active: test
那么项目就会运行在 8081 端口,切换成激活了 test
的 Profile,即 application-test.yml
中的配置生效。
通过这个方法,我们可以快速切换适用于不同环境下的配置。
yml 多文档方式
在多 Profile 文件方式中我们发现,我们需要新建多个 yml
或 properties
文件,这样有些许麻烦,那么是否可以将不同环境下的配置写在同一个配置文件中,并用特殊的符号隔开呢?答案是有的,如下:
---
server:
port: 8081
spring:
profiles: test
---
server:
port: 8082
spring:
profiles: dev
---
spring:
profiles:
active: dev
不同的配置文件我们只需要使用 ---
隔开即可。