欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring Boot 配置文件詳解(小結(jié))

 更新時(shí)間:2018年04月05日 11:32:42   作者:ITDragon龍  
Spring Boot提供了兩種常用的配置文件,分別是properties文件和yml文件。本章重點(diǎn)介紹yml的語(yǔ)法和從配置文件中取值。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

Spring Boot提供了兩種常用的配置文件,分別是properties文件和yml文件。他們的作用都是修改Spring Boot自動(dòng)配置的默認(rèn)值。相對(duì)于properties文件而言,yml文件更年輕,也有很多的坑??芍^成也蕭何敗蕭何,yml通過(guò)空格來(lái)確定層級(jí)關(guān)系,是配置文件結(jié)構(gòu)跟清晰,但也會(huì)因?yàn)槲⒉蛔愕赖目崭穸茐牧藢蛹?jí)關(guān)系。本章重點(diǎn)介紹yml的語(yǔ)法和從配置文件中取值。還在等什么,趕快來(lái)學(xué)習(xí)吧!

技術(shù):yaml、properties語(yǔ)法,ConfigurationProperties和Value注解的使用,配置文件占位符的使用

說(shuō)明:本章重點(diǎn)介紹yaml的語(yǔ)法和ConfigurationProperties注解的使用,測(cè)試代碼和完整代碼請(qǐng)移步github,喜歡的朋友可以點(diǎn)個(gè)star。

源碼: https://github.com/ITDragonBlog/daydayup/tree/master/SpringBoot/spring-boot-yml

文章目錄結(jié)構(gòu):

一、YAML簡(jiǎn)介

yml是YAML(YAML Ain't Markup Language)語(yǔ)言的文件,以數(shù)據(jù)為中心,比json、xml等更適合做配置文件

yml和xml相比,少了一些結(jié)構(gòu)化的代碼,使數(shù)據(jù)更直接,一目了然。

yml和json呢?沒(méi)有誰(shuí)好誰(shuí)壞,合適才是最好的。yml的語(yǔ)法比json優(yōu)雅,注釋更標(biāo)準(zhǔn),適合做配置文件。json作為一種機(jī)器交換格式比yml強(qiáng),更適合做api調(diào)用的數(shù)據(jù)交換。

一)YAML語(yǔ)法

以空格的縮進(jìn)程度來(lái)控制層級(jí)關(guān)系。空格的個(gè)數(shù)并不重要,只要左邊空格對(duì)齊則視為同一個(gè)層級(jí)。注意不能用tab代替空格。且大小寫敏感。支持字面值,對(duì)象,數(shù)組三種數(shù)據(jù)結(jié)構(gòu),也支持復(fù)合結(jié)構(gòu)。

字面值:字符串,布爾類型,數(shù)值,日期。字符串默認(rèn)不加引號(hào),單引號(hào)會(huì)轉(zhuǎn)義特殊字符。日期格式支持yyyy/MM/dd HH:mm:ss

對(duì)象:由鍵值對(duì)組成,形如 key:(空格)value 的數(shù)據(jù)組成。冒號(hào)后面的空格是必須要有的,每組鍵值對(duì)占用一行,且縮進(jìn)的程度要一致,也可以使用行內(nèi)寫法:{k1: v1, ....kn: vn}

數(shù)組:由形如 -(空格)value 的數(shù)據(jù)組成。短橫線后面的空格是必須要有的,每組數(shù)據(jù)占用一行,且縮進(jìn)的程度要一致,也可以使用行內(nèi)寫法: [1,2,...n]

復(fù)合結(jié)構(gòu):上面三種數(shù)據(jù)結(jié)構(gòu)任意組合

二)YAML的運(yùn)用

創(chuàng)建一個(gè)Spring Boot 的全局配置文件 application.yml,配置屬性參數(shù)。主要有字符串,帶特殊字符的字符串,布爾類型,數(shù)值,集合,行內(nèi)集合,行內(nèi)對(duì)象,集合對(duì)象這幾種常用的數(shù)據(jù)格式。

yaml:
 str: 字符串可以不加引號(hào)
 specialStr: "雙引號(hào)直接輸出\n特殊字符"
 specialStr2: '單引號(hào)可以轉(zhuǎn)義\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

創(chuàng)建實(shí)體類YamlEntity.java 獲取配置文件中的屬性值, 通過(guò)注解@ConfigurationProperties獲取配置文件中的指定值并注入到實(shí)體類中 。其具體的測(cè)試方法和獲取值的原理,請(qǐng)繼續(xù)往后看!

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 語(yǔ)法實(shí)體類
 * 切記點(diǎn):
 * 一、冒號(hào)后面加空格,即 key:(空格)value
 * 二、每行參數(shù)左邊空格數(shù)量決定了該參數(shù)的層級(jí),不可亂輸入。
 */
@Component
@ConfigurationProperties(prefix = "yaml")
public class YamlEntity {

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

  // 數(shù)組,List和Set,兩種寫法: 第一種:-空格value,每個(gè)值占一行,需縮進(jìn)對(duì)齊;第二種:[1,2,...n] 行內(nèi)寫法
  private List<Object> list; // list可重復(fù)集合
  private Set<Object> set;  // set不可重復(fù)集合

  // Map和實(shí)體類,兩種寫法:第一種:key空格value,每個(gè)值占一行,需縮進(jìn)對(duì)齊;第二種:{key: value,....} 行內(nèi)寫法
  private Map<String, Object> map; // Map K-V
  private List<Position> positions; // 復(fù)合結(jié)構(gòu),集合對(duì)象

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

三)YML小結(jié)

一、字符串可以不加引號(hào),若加雙引號(hào)則輸出特殊字符,若不加或加單引號(hào)則轉(zhuǎn)義特殊字符;

二、數(shù)組類型,短橫線后面要有空格;對(duì)象類型,冒號(hào)后面要有空格;

三、YAML是以空格縮進(jìn)的程度來(lái)控制層級(jí)關(guān)系,但不能用tab鍵代替空格,大小寫敏感;

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

二、Properties簡(jiǎn)介

properties文件大家經(jīng)常用,這里就簡(jiǎn)單介紹一下。其語(yǔ)法結(jié)構(gòu)形如:key=value。注意中文亂碼問(wèn)題,需要轉(zhuǎn)碼成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架構(gòu)師
userinfo.position.salary=19999.99

從配置文件中取值注入到實(shí)體類中,和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 : 被修飾類中的所有屬性會(huì)和配置文件中的指定值(該值通過(guò)prefix找到)進(jìn)行綁定
 */
@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方法
}

三、配置文件取值

Spring Boot通過(guò)ConfigurationProperties注解從配置文件中獲取屬性。從上面的例子可以看出ConfigurationProperties注解可以通過(guò)設(shè)置prefix指定需要批量導(dǎo)入的數(shù)據(jù)。支持獲取字面值,集合,Map,對(duì)象等復(fù)雜數(shù)據(jù)。ConfigurationProperties注解還有其他特么呢?它和Spring的Value注解又有什么區(qū)別呢?帶著這些問(wèn)題,我們繼續(xù)往下看。(๑•̀ㅂ•́)و✧

一)ConfigurationProperties和Value優(yōu)缺點(diǎn)

ConfigurationProperties注解的優(yōu)缺點(diǎn)

一、可以從配置文件中批量注入屬性;

二、支持獲取復(fù)雜的數(shù)據(jù)類型;

三、對(duì)屬性名匹配的要求較低,比如user-name,user_name,userName,USER_NAME都可以取值;

四、支持JAVA的JSR303數(shù)據(jù)校驗(yàn);

五、缺點(diǎn)是不支持強(qiáng)大的SpEL表達(dá)式;

Value注解的優(yōu)缺點(diǎn)正好相反,它只能一個(gè)個(gè)配置注入值;不支持?jǐn)?shù)組、集合等復(fù)雜的數(shù)據(jù)類型;不支持?jǐn)?shù)據(jù)校驗(yàn);對(duì)屬性名匹配有嚴(yán)格的要求。最大的特點(diǎn)是支持SpEL表達(dá)式,使其擁有更豐富的功能。

二)@ConfigurationProperties詳解

第一步:導(dǎo)入依賴。若要使用ConfigurationProperties注解,需要導(dǎo)入依賴 spring-boot-configuration-processor;

第二步:配置數(shù)據(jù)。在application.yml配置文件中,配置屬性參數(shù),其前綴為itdragon,參數(shù)有字面值和數(shù)組,用來(lái)判斷是否支持獲取復(fù)雜屬性的能力;

第三步:匹配數(shù)據(jù)。在類上添加注解ConfigurationProperties,并設(shè)置prefix屬性值為itdragon。并把該類添加到Spring的IOC容器中。

第四步:校驗(yàn)數(shù)據(jù)。添加數(shù)據(jù)校驗(yàn)Validated注解,開啟數(shù)據(jù)校驗(yàn),測(cè)試其是否支持?jǐn)?shù)據(jù)校驗(yàn)的功能;

第五步:測(cè)試ConfigurationProperties注解是否支持SpEL表達(dá)式;

導(dǎo)入依賴:pom.xml 添加 spring-boot-configuration-processor依賴

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

配置數(shù)據(jù):application.yml 配置屬性參數(shù),nick-name是用來(lái)判斷匹配屬性的松散性,若換成nick_name依然可以獲取值。

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

匹配和校驗(yàn)數(shù)據(jù):

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 注解語(yǔ)法類
 * 第一步:導(dǎo)入依賴 spring-boot-configuration-processor;
 * 第二步:把ConfigurationProperties注解修飾的類添加到Spring的IOC容器中;
 * 第三步:設(shè)置prefix屬性,指定需要注入屬性的前綴;
 * 第四步:添加數(shù)據(jù)校驗(yàn)注解,開啟數(shù)據(jù)校驗(yàn);
 *
 * 注意點(diǎn):
 * 一、nickName和createdDate在yml配置文件中,對(duì)應(yīng)參數(shù)分別是中劃線和下劃線,用于測(cè)試其對(duì)屬性名匹配的松散性
 * 二、email和iphone 測(cè)試其支持JSR303數(shù)據(jù)校驗(yàn)
 * 三、abilities 測(cè)試其支持復(fù)雜的數(shù)據(jù)結(jié)構(gòu)
 */
@Component
@ConfigurationProperties(prefix = "itdragon")
@Validated
public class ConfigurationPropertiesEntity {

  private String nickName;  // 解析成功,支持松散匹配屬性
  private String email;
//  @Email           // 解析失敗,數(shù)據(jù)校驗(yàn)成功: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;  // 語(yǔ)法報(bào)錯(cuò),不支持SpEL表達(dá)式:not applicable to field

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

三)@Value詳解

上一篇博客已經(jīng)介紹過(guò)Value注解的使用,這里只簡(jiǎn)單說(shuō)明。

第一步:在屬性上添加Value注解,通過(guò)${}設(shè)置參數(shù)從配置文件中注入值;

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

第三步:添加數(shù)據(jù)校驗(yàn)Validated注解,開啟數(shù)據(jù)校驗(yàn),測(cè)試其是否支持?jǐn)?shù)據(jù)校驗(yàn)的功能;

第四步:測(cè)試Value注解是否支持SpEL表達(dá)式;

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 注解語(yǔ)法類
 * 第一步:在屬性上添加注解Value注入?yún)?shù)
 * 第二步:把Value注解修飾的類添加到Spring的IOC容器中;
 * 第三步:添加數(shù)據(jù)校驗(yàn)注解,檢查是否支持?jǐn)?shù)據(jù)校驗(yàn);
 *
 * 注意點(diǎn):
 * 一、nickName和createdDate在yml配置文件中,對(duì)應(yīng)參數(shù)分別是中劃線和下劃線,用于測(cè)試其對(duì)屬性名匹配的松散性
 * 二、email和iphone 測(cè)試其支持JSR303數(shù)據(jù)校驗(yàn)
 * 三、abilities 測(cè)試其支持復(fù)雜的數(shù)據(jù)結(jié)構(gòu)
 *
 * 結(jié)論:
 * 一、createDate取值必須和yml配置文件中的參數(shù)保持一致,
 * 二、既是在iphone上添加郵箱驗(yàn)證注解依然可以通過(guò)測(cè)試,
 * 三、不支持復(fù)雜的數(shù)據(jù)結(jié)構(gòu),提示錯(cuò)誤和第一條相同: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}")    // 解析成功,并不支持?jǐn)?shù)據(jù)校驗(yàn)
  private String iphone;
//  @Value("${itdragon.abilities}")   // 解析錯(cuò)誤,并不支持復(fù)雜的數(shù)據(jù)結(jié)構(gòu)
  private List<String> abilities;
//  @Value("${itdragon.ceatredDate}")  // 解析錯(cuò)誤,并不支持松散匹配屬性,必須嚴(yán)格一致
  private Date createdDate;

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

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

四)配置文件取值小結(jié)

一、ConfigurationProperties注解支持批量注入,而Value注解適合單個(gè)注入;

二、ConfigurationProperties注解支持?jǐn)?shù)據(jù)校驗(yàn),而Value注解不支持;

三、ConfigurationProperties注解支持松散匹配屬性,而Value注解必須嚴(yán)格匹配屬性;

四、ConfigurationProperties不支持強(qiáng)大的SpEL表達(dá)式,而Value支持;

四、配置文件占位符

占位符和隨機(jī)數(shù)比較簡(jiǎn)單,這里就直接貼出代碼。需要注意的是:

一、占位符的值必須是完整路徑

二、占位符設(shè)置默認(rèn)值,冒號(hào)后面不能有空格

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;

/**
 * 隨機(jī)數(shù)和占位符語(yǔ)法類
 */
@Component
@ConfigurationProperties(prefix = "ran")
public class RandomEntity {

  private String ranValue;  // 隨機(jī)生成一個(gè)字符串
  private Integer ranInt;   // 隨機(jī)生成一個(gè)整數(shù)
  private Long ranLong;    // 隨機(jī)生成一個(gè)長(zhǎng)整數(shù)
  private Integer ranIntNum; // 在指定范圍內(nèi)隨機(jī)生成一個(gè)整數(shù)
  private Integer ranIntRange;// 在指定區(qū)間內(nèi)隨機(jī)生成一個(gè)整數(shù)
  private String ranPlaceholder;// 占位符

  // 省略getter,setter,toString方法e
}
測(cè)試代碼:

@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);
  }

}

五、總結(jié)

一、Spring Boot 支持兩種格式的配置文件,其中YAML的數(shù)據(jù)結(jié)構(gòu)比properties更清晰。

二、YAML 是專門用來(lái)寫配置文件的語(yǔ)言,非常簡(jiǎn)潔和強(qiáng)大。

三、YAML 對(duì)空格的要求很嚴(yán)格,且不能用Tab鍵代替。

四、YAML 通過(guò)空格縮進(jìn)的程度確定層級(jí),冒號(hào)后面有空格,短橫線后面有空格。

五、ConfigurationProperties注解適合批量注入配置文件中的屬性,Value注解適合獲取配置文件中的某一項(xiàng)。

六、ConfigurationProperties注解支持?jǐn)?shù)據(jù)校驗(yàn)和獲取復(fù)雜的數(shù)據(jù),Value注解支持SpEL表達(dá)式。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Mybatis-plus獲取雪花算法生成的ID并返回生成ID

    Mybatis-plus獲取雪花算法生成的ID并返回生成ID

    本文主要介紹了Mybatis-plus獲取雪花算法生成的ID并返回生成ID,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • IDEA中scala生成變量后自動(dòng)顯示變量類型問(wèn)題

    IDEA中scala生成變量后自動(dòng)顯示變量類型問(wèn)題

    這篇文章主要介紹了IDEA中scala生成變量后自動(dòng)顯示變量類型問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Java基礎(chǔ)之自動(dòng)裝箱,注解操作示例

    Java基礎(chǔ)之自動(dòng)裝箱,注解操作示例

    這篇文章主要介紹了Java基礎(chǔ)之自動(dòng)裝箱,注解操作,結(jié)合實(shí)例形式分析了java拆箱、裝箱、靜態(tài)導(dǎo)入、注釋等相關(guān)使用技巧,需要的朋友可以參考下
    2019-08-08
  • Spring的AOP極簡(jiǎn)入門

    Spring的AOP極簡(jiǎn)入門

    今天小編就為大家分享一篇關(guān)于Spring的AOP極簡(jiǎn)入門,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • Java使用集合實(shí)現(xiàn)斗地主分牌完整代碼

    Java使用集合實(shí)現(xiàn)斗地主分牌完整代碼

    在斗地主游戲中,通常是將一副牌平均分成3份,每份17張牌,并留3張底牌,我們可以使用集合來(lái)實(shí)現(xiàn)這一功能,這篇文章主要給大家介紹了關(guān)于Java使用集合實(shí)現(xiàn)斗地主分牌的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • Java中Map的entrySet()使用說(shuō)明

    Java中Map的entrySet()使用說(shuō)明

    這篇文章主要介紹了Java中Map的entrySet()使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • Java?Valhalla?Project項(xiàng)目介紹

    Java?Valhalla?Project項(xiàng)目介紹

    這篇文章主要介紹了Java?Valhalla?Project項(xiàng)目介紹,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • Java不可不知的泛型使用示例代碼

    Java不可不知的泛型使用示例代碼

    這篇文章主要介紹了Java不可不知的泛型使用,本文通過(guò)實(shí)例代碼給大家介紹了java的泛型的基本使用,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Elasticsearch索引結(jié)構(gòu)與算法解析

    Elasticsearch索引結(jié)構(gòu)與算法解析

    ?作為搜索引擎的一部分,ES自然具有速度快、結(jié)果準(zhǔn)確、結(jié)果豐富等特點(diǎn),那么ES是如何達(dá)到“搜索引擎”級(jí)別的查詢效率呢?首先是索引,其次是壓縮算法,接下來(lái)我們就一起了解下ES的索引結(jié)構(gòu)和壓縮算法
    2023-04-04
  • Java中Hutool克隆功能的使用

    Java中Hutool克隆功能的使用

    本文主要介紹了Java中Hutool克隆功能的使用,cn.hutool.core.clone.Cloneable?是Hutool中提供的一個(gè)接口,用于支持對(duì)象的深度克隆操作,下面就一起來(lái)介紹一下
    2024-04-04

最新評(píng)論