中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Boot配置文件的示例分析

發布時間:2021-08-20 12:59:02 來源:億速云 閱讀:155 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“Spring Boot配置文件的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Spring Boot配置文件的示例分析”這篇文章吧。

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

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

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

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

文章目錄結構:

Spring Boot配置文件的示例分析

一、YAML簡介

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

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

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

一)YAML語法

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

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

對象:由鍵值對組成,形如 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 語法實體類
 * 切記點:
 * 一、冒號后面加空格,即 key:(空格)value
 * 二、每行參數左邊空格數量決定了該參數的層級,不可亂輸入。
 */
@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小結

一、字符串可以不加引號,若加雙引號則輸出特殊字符,若不加或加單引號則轉義特殊字符;

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

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

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

二、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方法
}

三、配置文件取值

Spring Boot通過ConfigurationProperties注解從配置文件中獲取屬性。從上面的例子可以看出ConfigurationProperties注解可以通過設置prefix指定需要批量導入的數據。支持獲取字面值,集合,Map,對象等復雜數據。ConfigurationProperties注解還有其他特么呢?它和Spring的Value注解又有什么區別呢?帶著這些問題,我們繼續往下看。(??????)??

一)ConfigurationProperties和Value優缺點

ConfigurationProperties注解的優缺點

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

二、支持獲取復雜的數據類型;

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

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

五、缺點是不支持強大的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屬性,指定需要注入屬性的前綴;
 * 第四步:添加數據校驗注解,開啟數據校驗;
 *
 * 注意點:
 * 一、nickName和createdDate在yml配置文件中,對應參數分別是中劃線和下劃線,用于測試其對屬性名匹配的松散性
 * 二、email和iphone 測試其支持JSR303數據校驗
 * 三、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容器中;
 * 第三步:添加數據校驗注解,檢查是否支持數據校驗;
 *
 * 注意點:
 * 一、nickName和createdDate在yml配置文件中,對應參數分別是中劃線和下劃線,用于測試其對屬性名匹配的松散性
 * 二、email和iphone 測試其支持JSR303數據校驗
 * 三、abilities 測試其支持復雜的數據結構
 *
 * 結論:
 * 一、createDate取值必須和yml配置文件中的參數保持一致,
 * 二、既是在iphone上添加郵箱驗證注解依然可以通過測試,
 * 三、不支持復雜的數據結構,提示錯誤和第一條相同: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方法
}

四)配置文件取值小結

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

二、ConfigurationProperties注解支持數據校驗,而Value注解不支持;

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

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

四、配置文件占位符

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

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

二、占位符設置默認值,冒號后面不能有空格

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

}

以上是“Spring Boot配置文件的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

揭东县| 陇南市| 睢宁县| 沁源县| 池州市| 罗源县| 英山县| 鄄城县| 宁海县| 定兴县| 漾濞| 宁远县| 洛宁县| 诸城市| 庐江县| 乌拉特后旗| 华坪县| 偏关县| 洛隆县| 信丰县| 柳州市| 西宁市| 教育| 黑龙江省| 佛山市| 昌江| 宜丰县| 西华县| 裕民县| 噶尔县| 泾阳县| 永顺县| 夏津县| 华容县| 德兴市| 沛县| 黄平县| 水富县| 阿拉善右旗| 拜泉县| 西和县|