本文适用版本:Spring Boot v2.5.4
本文使用配置文件类型:YAML,非properties,这种文件用缩进代表层级关系,需要特别注意的是冒号“:”必须是英文类型的,且后面有个空格,如:
server: port: 8080 myenv: name: 开发环境
如果写成中文冒号,或者冒号后面没有空格,可能会有怪异结果出现,大家务必小心检查。
下面正文开始
需求:
由application.yml指定环境是dev、test或是stage、prod,环境细节在三个不同文件里书写。
实现步骤:
1.准备application.yml
在src/main/resource目录下删除原有文件application.properties(如果有的话),新建文本文件application.yml,内容如下:
#application.yml spring: profiles: active: dev
第一行为注释可以忽略,下面三行的意思是让SpringBoot去找application-dev.yml文件(也在src/main/resource目录下),如果将dev修改成prod,那么会让SpringBoot去找application-prod.yml文件,其它test、stage据此类推。
2.准备application-dev.yml、application-prod.yml、application-test.yml三个文件,三个文件内容如下:
application-dev.yml
server: port: 8080 myenv: name: 开发环境
application-prod.yml
server: port: 8088 myenv: name: 生产环境
application-test.yml
server: port: 8085 myenv: name: 测试环境
如果还有更多的环境,如application-stage.yml,拷贝一份改名修改即可。
3.如果上两步都正确,那多环境设置实际就成功了,启动启动类,在控制台可以看到是那种环境启动了,及指定的端口信息:
2021-09-21。。。。 com.hy.myapp.MyApplication : The following profiles are active: dev 2021-09-21。。。。 o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
从上面可以看出当前是开发环境,服务端口是8080。
我们还可以运行测试类来确定当前环境:
import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest class MyApplicationTests { @Value("${server.port}") private String serverPort; @Value("${myenv.name}") private String myenvName; @Test void contextLoads() { } @Test void testEnvironment() { System.out.println("myenvName="+myenvName); System.out.println("serverPort="+serverPort); } }
上面这个类通过Value注解的方式将端口赋予了serverPort成员,环境名称赋予了myenvName成员,我们跑以下junit就知道当前环境了。
2021-09-21 14:55:42.154 INFO 2300 --- [ main] com.hy.myapp.MyApplicationTests : Started MyApplicationTests in 3.154 seconds (JVM running for 5.168) myenvName=开发环境 serverPort=8080