Spring Boot配置文件詳解

Spring Boot配置文件詳解

Spring Boot提供了兩種經常使用的配置文件,分別是properties文件和yml文件。他們的做用都是修改Spring Boot自動配置的默認值。相對於properties文件而言,yml文件更年輕,也有不少的坑。可謂成也蕭何敗也蕭何,yml經過空格來肯定層級關係,是配置文件結構更清晰,但也會由於微不足道的空格而破壞了層級關係。本章重點介紹yml的語法和從配置文件中取值。還在等什麼,趕快來學習吧!html

技術:yaml、properties語法,ConfigurationProperties和Value註解的使用,配置文件佔位符的使用java

說明:本章重點介紹yaml的語法和ConfigurationProperties註解的使用,測試代碼和完整代碼請移步github,喜歡的朋友能夠點個star。git

源碼:https://github.com/ITDragonBl...程序員

文章目錄結構:
github

1、YAML簡介

yml是YAML(YAML Ain't Markup Language)語言的文件,以數據爲中心,比json、xml等更適合作配置文件

yml和xml相比,少了一些結構化的代碼,使數據更直接,一目瞭然。spring

yml和json呢?沒有誰好誰壞,合適纔是最好的。yml的語法比json優雅,註釋更標準,適合作配置文件。json做爲一種機器交換格式比yml強,更適合作api調用的數據交換。sql

一)YAML語法

以空格的縮進程度來控制層級關係。空格的個數並不重要,只要左邊空格對齊則視爲同一個層級。注意不能用tab代替空格。且大小寫敏感。支持字面值,對象,數組三種數據結構,也支持複合結構。json

字面值:字符串,布爾類型,數值,日期。字符串默認不加引號,單引號會轉義特殊字符。日期格式支持yyyy/MM/dd HH:mm:ssapi

對象:由鍵值對組成,形如 key:(空格)value 的數據組成。冒號後面的空格是必需要有的,每組鍵值對佔用一行,且縮進的程度要一致,也可使用行內寫法:{k1: v1, ....kn: vn}數組

數組:由形如 -(空格)value 的數據組成。短橫線後面的空格是必需要有的,每組數據佔用一行,且縮進的程度要一致,也可使用行內寫法: [1,2,...n]

複合結構:上面三種數據結構任意組合

二)YAML的運用

建立一個Spring Boot 的全局配置文件 application.yml,配置屬性參數。主要有字符串,帶特殊字符的字符串,布爾類型,數值,集合,行內集合,行內對象,集合對象這幾種經常使用的數據格式。

yaml:
  str: 字符串能夠不加引號
  specialStr: "雙引號直接輸出\n特殊字符"
  specialStr2: '單引號能夠轉義\n特殊字符'
  flag: false
  num: 666
  Dnum: 88.88
  list:
    - one
    - two
    - two
  set: [1,2,2,3]
  map: {k1: v1, k2: v2}
  positions:
    - name: ITDragon
      salary: 15000.00
    - name: ITDragonBlog
      salary: 18888.88

建立實體類YamlEntity.java 獲取配置文件中的屬性值,經過註解@ConfigurationProperties獲取配置文件中的指定值並注入到實體類中。其具體的測試方法和獲取值的原理,請繼續日後看!

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
 * YAML 語法實體類
 * 切記點:
 * 1、冒號後面加空格,即 key:(空格)value
 * 2、每行參數左邊空格數量決定了該參數的層級,不可亂輸入。
 */
@Component
@ConfigurationProperties(prefix = "yaml")
public class YamlEntity {

    // 字面值,字符串,布爾,數值
    private String str; // 普通字符串
    private String specialStr; // 轉義特殊字符串
    private String specialStr2;// 輸出特殊字符串
    private Boolean flag;   // 布爾類型
    private Integer num;    // 整數
    private Double dNum;    // 小數

    // 數組,List和Set,兩種寫法: 第一種:-空格value,每一個值佔一行,需縮進對齊;第二種:[1,2,...n] 行內寫法
    private List<Object> list;  // list可重複集合
    private Set<Object> set;    // set不可重複集合

    // Map和實體類,兩種寫法:第一種:key空格value,每一個值佔一行,需縮進對齊;第二種:{key: value,....} 行內寫法
    private Map<String, Object> map; // Map K-V
    private List<Position> positions;  // 複合結構,集合對象

    // 省略getter,setter,toString方法
}

三)YML小結

1、字符串能夠不加引號,若加雙引號則輸出特殊字符,若不加或加單引號則轉義特殊字符;

2、數組類型,短橫線後面要有空格;對象類型,冒號後面要有空格;

3、YAML是以空格縮進的程度來控制層級關係,但不能用tab鍵代替空格,大小寫敏感;

4、如何讓一個程序員崩潰?在yml文件中加幾個空格!(〃>皿<)

2、Properties簡介

properties文件你們常常用,這裏就簡單介紹一下。其語法結構形如:key=value。注意中文亂碼問題,須要轉碼成ASCII。具體以下所示:

userinfo.account=itdragonBlog
userinfo.age=25
userinfo.active=true
userinfo.created-date=2018/03/31 16:54:30
userinfo.map.k1=v1
userinfo.map.k2=v2
userinfo.list=one,two,three
userinfo.position.name=Java架構師
userinfo.position.salary=19999.99

從配置文件中取值注入到實體類中,和YAML是同樣的。

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
 * 用戶信息
 * @ConfigurationProperties : 被修飾類中的全部屬性會和配置文件中的指定值(該值經過prefix找到)進行綁定
 */
@Component
@ConfigurationProperties(prefix = "userinfo")
public class UserInfo {

    private String account;
    private Integer age;
    private Boolean active;
    private Date createdDate;
    private Map<String, Object> map;
    private List<Object> list;
    private Position position;

   // 省略getter,setter,toString方法
}

3、配置文件取值

Spring Boot經過ConfigurationProperties註解從配置文件中獲取屬性。從上面的例子能夠看出ConfigurationProperties註解能夠經過設置prefix指定須要批量導入的數據。支持獲取字面值,集合,Map,對象等複雜數據。ConfigurationProperties註解還有其餘特麼呢?它和Spring的Value註解又有什麼區別呢?帶着這些問題,咱們繼續往下看。(๑•̀ㅂ•́)و✧

一)ConfigurationProperties和Value優缺點

ConfigurationProperties註解的優缺點

1、能夠從配置文件中批量注入屬性;

2、支持獲取複雜的數據類型;

3、對屬性名匹配的要求較低,好比user-name,user_name,userName,USER_NAME均可以取值;

4、支持JAVA的JSR303數據校驗;

5、缺點是不支持強大的SpEL表達式;

Value註解的優缺點正好相反,它只能一個個配置注入值;不支持數組、集合等複雜的數據類型;不支持數據校驗;對屬性名匹配有嚴格的要求。最大的特色是支持SpEL表達式,使其擁有更豐富的功能。

二)@ConfigurationProperties詳解

第一步:導入依賴。若要使用ConfigurationProperties註解,須要導入依賴 spring-boot-configuration-processor;

第二步:配置數據。在application.yml配置文件中,配置屬性參數,其前綴爲itdragon,參數有字面值和數組,用來判斷是否支持獲取複雜屬性的能力;

第三步:匹配數據。在類上添加註解ConfigurationProperties,並設置prefix屬性值爲itdragon。並把該類添加到Spring的IOC容器中。

第四步:校驗數據。添加數據校驗Validated註解,開啓數據校驗,測試其是否支持數據校驗的功能;

第五步:測試ConfigurationProperties註解是否支持SpEL表達式;

導入依賴:pom.xml 添加 spring-boot-configuration-processor依賴

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-configuration-processor</artifactId>
  <optional>true</optional>
</dependency>

配置數據:application.yml 配置屬性參數,nick-name是用來判斷匹配屬性的鬆散性,若換成nick_name依然能夠獲取值。

itdragon:
  nick-name: ITDragonBlog
  email: 1234567890@qq.com
  iphone: 1234567890
  abilities: [java, sql, html]
  created_date: 2018/03/31 15:27:30

匹配和校驗數據:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.Email;
import java.util.Date;
import java.util.List;
/**
 * ConfigurationProperties 註解語法類
 * 第一步:導入依賴 spring-boot-configuration-processor;
 * 第二步:把ConfigurationProperties註解修飾的類添加到Spring的IOC容器中;
 * 第三步:設置prefix屬性,指定須要注入屬性的前綴;
 * 第四步:添加數據校驗註解,開啓數據校驗;
 *
 * 注意點:
 * 1、nickName和createdDate在yml配置文件中,對應參數分別是中劃線和下劃線,用於測試其對屬性名匹配的鬆散性
 * 2、email和iphone 測試其支持JSR303數據校驗
 * 3、abilities 測試其支持複雜的數據結構
 */
@Component
@ConfigurationProperties(prefix = "itdragon")
@Validated
public class ConfigurationPropertiesEntity {

    private String nickName;    // 解析成功,支持鬆散匹配屬性
    private String email;
//    @Email                      // 解析失敗,數據校驗成功:BindValidationException: Binding validation errors on itdragon
    private String iphone;
    private List<String> abilities;
    private Date createdDate;   // 解析成功,支持鬆散匹配屬性

//    @ConfigurationProperties("#{(1+2-3)/4*5}")
    private String operator;    // 語法報錯,不支持SpEL表達式:not applicable to field

    // 省略getter,setter,toString方法
}

三)@Value詳解

上一篇博客已經介紹過Value註解的使用,這裏只簡單說明。

第一步:在屬性上添加Value註解,經過${}設置參數從配置文件中注入值;

第二步:修改${itdragon.ceatred_date}中的參數值,改成${itdragon.ceatredDate}測試是否能解析成功;

第三步:添加數據校驗Validated註解,開啓數據校驗,測試其是否支持數據校驗的功能;

第四步:測試Value註解是否支持SpEL表達式;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.Email;
import java.util.Date;
import java.util.List;
/**
 * Value 註解語法類
 * 第一步:在屬性上添加註解Value注入參數
 * 第二步:把Value註解修飾的類添加到Spring的IOC容器中;
 * 第三步:添加數據校驗註解,檢查是否支持數據校驗;
 *
 * 注意點:
 * 1、nickName和createdDate在yml配置文件中,對應參數分別是中劃線和下劃線,用於測試其對屬性名匹配的鬆散性
 * 2、email和iphone 測試其支持JSR303數據校驗
 * 3、abilities 測試其支持複雜的數據結構
 *
 * 結論:
 * 1、createDate取值必須和yml配置文件中的參數保持一致,
 * 2、既是在iphone上添加郵箱驗證註解依然能夠經過測試,
 * 3、不支持複雜的數據結構,提示錯誤和第一條相同:IllegalArgumentException: Could not resolve placeholder 'itdragon.abilities' in value "${itdragon.abilities}"
 */
@Component
@Validated
public class ValueEntity {

    @Value("${itdragon.nick-name}")
    private String nickName;
    @Value("${itdragon.email}")
    private String email;
    @Email
    @Value("${itdragon.iphone}")        // 解析成功,並不支持數據校驗
    private String iphone;
//    @Value("${itdragon.abilities}")     // 解析錯誤,並不支持複雜的數據結構
    private List<String> abilities;
//    @Value("${itdragon.ceatredDate}")   // 解析錯誤,並不支持鬆散匹配屬性,必須嚴格一致
    private Date createdDate;

    // Value註解的強大一面:支持SpEL表達式
    @Value("#{(1+2-3)/4*5}")            // 算術運算
    private String operator;
    @Value("#{1>2 || 2 <= 3}")          // 關係運算
    private Boolean comparison;
    @Value("#{systemProperties['java.version']}") // 系統配置:os.name
    private String systemProperties;
    @Value("#{T(java.lang.Math).abs(-18)}") // 表達式
    private String mapExpression;

    // 省略getter,setter,toString方法
}

四)配置文件取值小結

1、ConfigurationProperties註解支持批量注入,而Value註解適合單個注入;

2、ConfigurationProperties註解支持數據校驗,而Value註解不支持;

3、ConfigurationProperties註解支持鬆散匹配屬性,而Value註解必須嚴格匹配屬性;

4、ConfigurationProperties不支持強大的SpEL表達式,而Value支持;

4、配置文件佔位符

佔位符和隨機數比較簡單,這裏就直接貼出代碼。須要注意的是:

1、佔位符的值必須是完整路徑

2、佔位符設置默認值,冒號後面不能有空格

ran:  # 這裏的prefix不能是random,
  ran-value: ${random.value}
  ran-int: ${random.int}
  ran-long: ${random.long}
  ran-int-num: ${random.int(10)}
  ran-int-range: ${random.int[10,20]}
  ran-placeholder: placeholder_${ran.ran-value:此處不能有空格,且key爲完整路徑}
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * 隨機數和佔位符語法類
 */
@Component
@ConfigurationProperties(prefix = "ran")
public class RandomEntity {

    private String ranValue;    // 隨機生成一個字符串
    private Integer ranInt;     // 隨機生成一個整數
    private Long ranLong;       // 隨機生成一個長整數
    private Integer ranIntNum;  // 在指定範圍內隨機生成一個整數
    private Integer ranIntRange;// 在指定區間內隨機生成一個整數
    private String ranPlaceholder;// 佔位符

    // 省略getter,setter,toString方法e
}

測試代碼:

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootYmlApplicationTests {

    @Autowired
    private UserInfo userInfo;
    @Autowired
    private YamlEntity yamlEntity;
    @Autowired
    private ConfigurationPropertiesEntity configurationPropertiesEntity;
    @Autowired
    private ValueEntity valueEntity;
    @Autowired
    private RandomEntity randomEntity;

    @Test
    public void contextLoads() {
//        System.out.println("YAML Grammar : " + yamlEntity);
//        System.out.println("UserInfo : " + userInfo);
//        System.out.println("ConfigurationProperties Grammar : " + configurationPropertiesEntity);
//        System.out.println("Value Grammar : " + valueEntity);
        System.out.println("Random Grammar : " + randomEntity);
    }

}

5、總結

1、Spring Boot 支持兩種格式的配置文件,其中YAML的數據結構比properties更清晰。

2、YAML 是專門用來寫配置文件的語言,很是簡潔和強大。

3、YAML 對空格的要求很嚴格,且不能用Tab鍵代替。

4、YAML 經過空格縮進的程度肯定層級,冒號後面有空格,短橫線後面有空格。

5、ConfigurationProperties註解適合批量注入配置文件中的屬性,Value註解適合獲取配置文件中的某一項。

6、ConfigurationProperties註解支持數據校驗和獲取複雜的數據,Value註解支持SpEL表達式。

文章到這裏就結束了。若是文章對你有幫助,能夠點個"推薦",也能夠"關注"我,得到更多豐富的知識。

這裏是博客文章目錄一欄表中的部份內容,若是有感興趣的內容能夠點擊右邊的連接: http://www.cnblogs.com/itdrag...

文章目錄

相關文章
相關標籤/搜索