【SpringBoot】多種環境自由切換,只需要配置文件這麼寫

yml配置文件很好用,但是實際生產中會有很多問題。

  1. 測試是一套配置,生產是一套配置;不同人開發不同的模塊,共用一個yml文件容易發生衝突;
  2. 本地開發需要本地化配置調試,本節咱們就把這些頭疼的問題統統解決掉。

首先我們建立一個工程,將application.properties文件後綴改成application.yml

name: 張三
lesson: springboot
desc: ${name}同學正在努力學習${lesson}!!! #佔位符

DemoController.java

@RestController
@RequestMapping("demo")
public class DemoController {

    @Resource
    private YmlData ymlData;

    @GetMapping("test")
    public void test() throws JsonProcessingException {
        System.out.println(ymlData.getDesc());
    }
}

YmlData.java

@Data
@Component
public class YmlData {

    @Value("${name}")
    private String name;
    @Value("${lesson}")
    private String lesson;
    @Value("${desc}")
    private String desc;
}

瀏覽器請求下http://localhost:8080/demo/test 看看控制檯,亂碼

設置編碼格式,ide-->file-->setting-->editor-->file encodings

設置完成後application.yml徹底亂碼了,重新輸入,改完重啓,再請求一次,控制檯輸出:

張三正在努力學習springboot!!!

這些跟多環境配置有什麼關係?

嗯,是沒關係,但是你多學了一個yml文件佔位符,且我們下面的示例也會根據這個變更。

application-prod.yml

name: 張三prod
lesson: springboot
desc: ${name}正在努力學習${lesson}!!!

application-dev.yml

name: 張三dev
lesson: springboot
desc: ${name}正在努力學習${lesson}!!!

application.yml

spring:
  profiles:
    active: dev #多環境變量的精髓,這裏確定是加載哪個配置文件!!!

好了,現在重啓,在執行一次請求,控制檯輸出的是什麼?

張三dev正在努力學習springboot!!!

那在調試的時候是否可以選擇加載哪個配置文件呢?,按下圖所示操作

重啓,看看現在打印的是什麼?

張三prod正在努力學習springboot!!!

再增加一個application-test.yml

name: 張三test

修改application.yml如下:

spring:
  profiles:
    include: test,prod #包含哪些配置
    active: dev #多環境變量的精髓,這裏確定是加載哪個配置文件!!!

重新啓動工程看看打印出來什麼?

張三prod正在努力學習springboot!!!

從結果我們可以看出,包含了include在內的配置,且相同配置在include的文件中使用的最後一個生效的。

而active文件中即使具有相同的配置(本文中的name配置)也沒有被覆蓋,另外include中包含的配置文件沒有的配置,會在active中補充上來。

總結來說:include和active取並集,相同的配置以include中的最後一個爲準!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章