1. 程式人生 > >SpringBoot開發詳解(三)--SpringBoot配置檔案YML注意事項

SpringBoot開發詳解(三)--SpringBoot配置檔案YML注意事項

轉載自:https://blog.csdn.net/qq_31001665/article/details/70197543#commentBox

一、多重層級讀取

在YML中我們再新增一個ZZP2的配置資訊,其中包含了girl節點以及girl下的name,age屬性。

zzp2:
  name: 西科啦啦
  age: 30
  height: 175cm
  weight: 760kg
  long: 10cm
  girl:
    name: Marry.Jean
    age: 18

和之前一樣,我們controller中通過@Value註解來獲取屬性值,同時建立一個url來輸出我們的屬性值。

@Value("${zzp2.name}")
private String name2;

@Value("${zzp2.girl.age}")
private Integer girlAge;

@Value("${zzp2.girl.name}")
private String girlName;

@RequestMapping(value = "/getZzpGirlInfo",method = RequestMethod.GET)
public String getZzpGirlInfo(){
    return "zzp2.name:" + name2 + "\n" + "zzp2.girl.age:" + girlAge + "\n" + "zzp2.girl.name:" + girlName;
}

接下來我們通過POSTMAN來訪問下,可以看到使用註解@Value沒有問題,都可以渠道屬性值。 

接下來我們按照之前的思路建立一個Zzp2properties來將配置檔案轉變為一個實體類進行接收,這個時候問題就來了,我們如何定義girl這個屬性呢,我們之前說過,配置檔案與實體類的對映是根據屬性名一致來相互對應的,可是我們無法命名一個屬性為girl.name啊。我想聰明的你應該已經想到了,是的,我們再建立一個實體類Girl來接收girl的引數,其中的屬性也是與girl下的引數一一對應。

public class Girl {

    private String name;

    private String age;

  //get set 方法...
}
@Component
@ConfigurationProperties(value = "zzp2")
public class Zzp2Properties {

    private String name;

    private String height;

    private String weight;

    private Integer age;

    private Girl girl;

    @Override
    public String toString() {
        return "Zzp2Properties{" +
                "name='" + name + '\'' +
                ", height='" + height + '\'' +
                ", weight='" + weight + '\'' +
                ", age=" + age +
                ", girl=" + girl +
                '}';
    }
    //get set方法...

之後我們再在controller中測試一下

@Autowired
private Zzp2Properties zzp2Properties;

@RequestMapping(value = "/getZzpGirlInfo2",method = RequestMethod.GET)
    public Zzp2Properties getZzpGirlInfo2(){
        return zzp2Properties;
    }

可以發現,girl的引數已經被注入進來,可以正常獲得了,這裡要特別說明的是在ZzpProperties中的屬性Girl命名一定是girl,必須要與配置檔案中的保持一致。

二、static靜態屬性

在一般開發中,我們經常會做靜態屬性或是靜態塊的方法來給我們的config使用,比如我使用jedis時,config中就是使用靜態塊來建立連結,那在YML中能否將配置資訊讀進static中呢?很可惜,答案是否定的。 
我們首先在application.yml中增加zzp3的配置資訊。

zzp3:
  name: 北坡卡卡
  age: 10
  height: 105cm
  weight: 30kg

然後在controller中通過設定靜態屬性來獲取配置資訊。

@Value("${zzp3.name}")
private static String name3;

@Value("${zzp3.age}")
private static Integer age3;

@Value("${zzp3.height}")
private static String height3;

@RequestMapping(value = "/getZzp3Info",method = RequestMethod.GET)
public String getZzp3Info(){
   return "zzp3.name:" + name3 + "\n" + "zzp3.age:" + age3 + "\n" + "zzp3.name:" + name3;
}

通過POSTMAN的測試,我們發想,屬性值都是null,無法得到配置檔案引數。 

那是不是我們就無法使用static來獲取配置資訊來呢?其實並不然,我們可以使用static屬性的set方法來獲取,我們新增三個引數的set方法,並吧set方法中的static給去掉,同時吧直接@Value置於set方法上。

private static String name3;

private static Integer age3;

private static String height3;

@Value("${zzp3.name}")
public void setName3(String name3) {
   Round2Controller.name3 = name3;
}

@Value("${zzp3.age}")
public void setAge3(Integer age3) {
   Round2Controller.age3 = age3;
}

@Value("${zzp3.height}")
public void setHeight3(String height3) {
   Round2Controller.height3 = height3;
}

我們仍舊通過POSTMAN來訪問看下結果,我們發現已經可以獲取到值了。 

三、開發環境切換

上次我們說到切換開發環境,但並沒有演示,我們這次來試一下,建立application-dev.yml其中將zzp3的配置資訊更換下,然後在application.yml中指定使用dev的引數給專案使用。

#application-dev.yml
zzp3:
  name: 西莫納納
  age: 99
  height: 95cm
  weight: 90kg
#application.yml
spring:
  profiles:
    active: dev

我們通過POSTMAN可以發現,zzp3的資訊已經是使用的dev的引數了。 

通常我們在開發中,重複的配置資訊不會重複寫,也就是說在application.yml定義好的配置資訊就不要在application-dev.yml再定義一次,我們只需要指定使用哪個環境的配置檔案即可。因為重複的進行配置會有許多意想不到的問題,比如之前我在使用xml進行mybatis的sql配置,但是每次訪問資料庫都會有‘沒有繫結的sql語句錯誤’。之後我們在聊mybatis連線資料庫時我們再詳細的說下這個問題。