(其他)透過yml設定檔注入參數至特定資料結構


目的:同標題1樣,方可進行其他設定或用途

必須知識:

  • java 8
  • spring系列

材料:

  1. yml
  2. 自定義資料結構 與設定檔

第1步:
我們先來想想需要什麼的資訊放在yml
此篇與「SpringBoot使用jms聆聽多個MQ(依據yml動態新增)」有關聯
採用這篇會用的資訊來做說明

```
mqList:
  - concurrency: "10-100"
    receive-timeout: -1
    queueManager: 自定義佇列管理者
    channel: 自定義頻道
    connName: host(ip)
    user:
    destination: 目標佇列名稱
  - concurrency: "10-100"
    receive-timeout: -1
    queueManager: 自定義佇列管理者
    channel: 自定義頻道
    connName: host(ip)
    user:
    destination: 目標佇列名稱
```

mqList為所有資訊的頭
-為1個完整資訊的頭
1個完整資訊底下有7個參數
這就是我們的yml

第2步:
我們要開始定義資料結構
這結構至少要和yml一模一樣的結構

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties
@Getter
@Setter
public class MQInfoConfiguration {

    // 為所有資訊的頭因此名稱為mqList
    // 每1組資訊都有7個參數的資料結構 稱為 MQInfo
    public List<MQInfo> mqList; 

    @Getter
    @Setter
    public static class MQInfo { // 這邊就根據我們要的7個屬性做設定
        public String concurrency;
        public int receiveTimeout;
        public String queueManager;
        public String channel;
        public String connName;
        public String user;
        public String destination;
    }
}

最後:
我們要進行注入與資料設定
以下是虛擬碼

     @Autowired
    MQInfoConMQInfoConfiguration mQInfoConfiguration;

    public void setMQ(Dto dto) {
            //  如果yml資訊有存在繼續進行
            if (CollectionUtils.isNotEmpty(mQInfoConfiguration.getMqList())) {
                int i = 0;
                // 跟據每1組資訊進行設定
                for (MQInfo.MQInfo mQInfo : mQInfoConfiguration.getMqList()) {
                    Factory factory = this.doSth(
                            mQInfo.getQueueManager(),
                            mQInfo.getChannel(),
                            mQInfo.getConnName()
                    );
                    ...
                    }

補充:
這邊給大家幾個不一樣的形式

(1)
yml都不變
透過@Value注入到變數
程式變得很攏長,且每個變數其實是獨立的,只有當看到@Value取用yml的路徑才會知到是有關聯的
因此不建議這樣注入

(2)
最上方跟大家介紹的模式演變是透過現在要介紹的

@Autowired(required= false)
MQInfoConMQInfoConfiguration mQInfoConfiguration = new MQInfoConMQInfoConfiguration();

public init(){
List<MQInfo> mqList = new ArraryList<>();
MqInfo mqInfo = new MqInfo();
mqInfo.setChannel("123");
...
// set the others
...
mqList.add(mqInfo);

MqInfo mqInfo2 = new MqInfo();
...
mqList.add(mqInfo2);

// 最後在set mQInfoConfiguration
mQInfoConfiguration.setMqList(mqList);

}

// 這邊設定參數 部份操作是1樣的
public void setMQ(Dto dto) {
            //  如果yml資訊有存在繼續進行
            if (CollectionUtils.isNotEmpty(mQInfoConfiguration.getMqList())) {
                int i = 0;
                // 跟據每1組資訊進行設定
                for (MQInfo.MQInfo mQInfo : mQInfoConfiguration.getMqList()) {
                    Factory factory = this.doSth(
                            mQInfo.getQueueManager(),
                            mQInfo.getChannel(),
                            mQInfo.getConnName()
                    );
                    ...
                    }

ref:

  1. YAML to List of Objects in Spring Boot
  2. Guide to @ConfigurationProperties in Spring Boot

主要是給自己的一個紀錄,也分享給有需要的夥伴
註解部分有提及一些參考的連結,有興趣可以點進去看看喔

這是一個心血來潮,產生的文章
若有喜歡或交流的部分都歡迎在下方留言,多多關照。

#spring boot #yml #config







你可能感興趣的文章

數據分析師的末日?GPT-4 的新功能 - code interpreter

數據分析師的末日?GPT-4 的新功能 - code interpreter

當 React web app 遇上 Progressive web app

當 React web app 遇上 Progressive web app

發現fork後的專案少了分支

發現fork後的專案少了分支






留言討論