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