Spring載入yml中自訂值的幾種方法
@Value、@ConfigurationProperties

用@Value獲取yml的值

基本用法: ${ property : default_value }

SPEL用法: #{ obj.property? : default_value }

這個冒號:,可以防止找不到此yml的時候無法啟動,如果是多人開發且有多個yml不好同步管理的話,最好加上以免影響別人

動態載入yml中的值

對於沒有在啟動時就載入的Class卻又想獲取yml,可以這樣用

@Slf4j
public class IL_BJ14Job implements Job {

    ApplicationContext appContext;
    CustomConfig customConfig;

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        log.info("BJ14 Process Begin = {}", new Date());
        if (appContext == null) appContext = ApplicationContextHolder.getContext();
        customConfig = (CustomConfig) appContext.getBean(CustomConfig.class);
        customConfig.getMyName()

其中CustomConfig是用@ConfigurationProperties載入的設定,詳細可以參考

@ConfigurationProperties 注解使用姿势,这一篇就够了 - 纪莫 - 博客园

@Data
@Component
@ConfigurationProperties(prefix = "customize")
@Validated
public class CustomConfig {
    @NotBlank
    private String myName;

    @Data
    public static class User{
        private String username;
        private String password;
        private String url;
    }

對應的yml長這樣

customize:
   my-name: 張三
   user:
      username: null
      password: null
      url: null

這個myName就對應到yml中的customize.myName,並且是寬鬆綁定,例如以下幾種在yml中的寫法都可以找到

  • customize.myName

  • customize.myname

  • customize.my-name

  • customize.my_name

  • customize.MY_NAME

註解@NotBlank則是配合@Validated可以在啟動時檢查,無法通過驗證就會報錯

而內部類User則是想再細分時的用法,注意要public static給人訪問

用@ConditionalOnExpression根據yml配置決定是否載入Bean

即按需加載,加速啟動、節省資源

  • 基本用法

    @ConditionalOnProperty(
            prefix = "customize",
            value = {"run-eventcallback"},
            havingValue = "true"
          )
    @Component()
    public class CheckLightStatusService{
    
  • 多條件

    @ConditionalOnExpression("'${mqtt.enabled:true}' or '${customize.slaveMqtt.enabled:true}' or '${customize.masterMqtt.enabled:true}'")
    @Component
    @Slf4j
    public class MqttSentEventListener implements ApplicationListener<MqttMessageSentEvent>{
    
  • 忽略大小寫

    @Service("BaiduUtilsServiceImpl")
    @ConditionalOnExpression("'${business.idCartOcr.choice}'.equalsIgnoreCase('BAIDU')")
    public class BaiduUtilsServiceImpl implements AiService {
    

上次修改於 2022-07-10