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