iT邦幫忙

2023 iThome 鐵人賽

0
Software Development

我在 Spring Boot 3 裡面挖呀挖呀挖系列 第 31

Day30 - Externalized Configuration

  • 分享至 

  • xImage
  •  

Day30 - Externalized Configuration

前言

Spring Boot提供外部化配置,它可以讓同樣的程式碼但在不一樣的環境中運行,也就是說當你透過IDE將你的程式碼打包成jar後,把jar放到測試環境或是正式環境它會依你放在jar旁邊的properties檔(或yaml檔)、環境變數或command-line給的參數不同來運行,程式可以透過@Value來取得設定檔的值,可以透過@ConfigurationProperties將所有設定值綁定到Java物件中。今天我們就來研究一下運行的機制吧

專案建立

https://ithelp.ithome.com.tw/upload/images/20231016/20128084nKkgdQ3pzJ.png
https://ithelp.ithome.com.tw/upload/images/20231016/20128084FM8cjS7hND.png

Externalized Configuration

PropertySource order

Spring Boot提供多樣化的設定屬性的方式,以下是優先及順序由低到高,一旦遇到衝突,後項蓋掉前項設定值

  1. Default properties (specified by setting SpringApplication.setDefaultProperties)
  2. @PropertySource指定加載的配置(需要寫在@Configuration類上才可生效)
  3. Config data(application.properties/yml等)
  4. RandomValuePropertySource支持的random.*配置(如:@Value("${random.int}"))
  5. OS environment variables
  6. Java System properties (System.getProperties())
  7. JNDI attributes from java:comp/env
  8. ServletContext init parameters
  9. ServletConfig init parameters
  10. Properties from SPRING_APPLICATION_JSON (inline JSON embedded in an environment variable or system property)
  11. Command line arguments
  12. 測試屬性。(@SpringBootTest進行測試時指定的屬性)
  13. @DynamicPropertySource annotations in your tests
  14. 測試類@TestPropertySource註解
  15. Devtools global settings properties in the $HOME/.config/spring-boot directory when devtools is active

Config data files order

若properties與yml同時存在會以properties優先

  1. jar 包內的application.properties/yml
  2. jar 包內的application-{profile}.properties/yml
  3. jar 包外的application.properties/yml
  4. jar 包外的application-{profile}.properties/yml

小結

  • 命令行 > 包外config直接子目錄 > 包外config目錄 > 包外根目錄 > 包內目錄
  • 同級比較:
    • profile配置 > 默認配置
    • properties配置 > yml配置

https://ithelp.ithome.com.tw/upload/images/20231016/20128084liRbL7EYS3.png

Importing Additional Data

當參數檔需要分拆檔案時,可以透過spring.config.import將其匯入,當需要調用參數檔時可在properties檔中使用${xxx:default value}
test.properties

app.greeting = Hello Day30_externalized_config

application.properties

spring.config.import=test.properties
app.sayhello= ${app.ccccc:hello james}

HelloController

@RestController
public class HelloController {
    @Value("${app.greeting}")
    private String greeting;
    @Value("${app.sayhello}")
    private String sayHello;

    @GetMapping("/hello")
    public String hello(){
        System.out.println("greeting:"+greeting);
        System.out.println("sayHello:"+sayHello);

        return greeting;
    }
}

result
https://ithelp.ithome.com.tw/upload/images/20231017/20128084DhWtsaJp6c.png

Reference


上一篇
Day29 - Profiles
系列文
我在 Spring Boot 3 裡面挖呀挖呀挖31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言