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連線資料庫時我們再詳細的說下這個問題。