SpringBoot特性_外部化配置(properties文件配置)
作者:xcbeyond
瘋狂源自夢想,技術(shù)成就輝煌!微信公眾號:《程序猿技術(shù)大咖》號主,專注后端開發(fā)多年,擁有豐富的研發(fā)經(jīng)驗,樂于技術(shù)輸出、分享,現(xiàn)階段從事微服務(wù)架構(gòu)項目的研發(fā)工作,涉及架構(gòu)設(shè)計、技術(shù)選型、業(yè)務(wù)研發(fā)等工作。對于Java、微服務(wù)、數(shù)據(jù)庫、Docker有深入了解,并有大量的調(diào)優(yōu)經(jīng)驗。
SpringBoot允許將配置進(jìn)行外部化(externalize),這樣你就能夠在不同的環(huán)境下使用相同的代碼。你可以使用properties文件,yaml文件,環(huán)境變量和命令行參數(shù)來外部化配置。使用@Value注解,可以直接將屬性值注入到beans中,然后通過Spring的Environment抽象或通過@ConfigurationProperties綁定到結(jié)構(gòu)化對象來訪問。
SpringBoot設(shè)計了一個非常特別的加載指定屬性文件的順序(@PropertySource),以允許對屬性值進(jìn)行合理的覆蓋,屬性會以如下的順序進(jìn)行設(shè)值:
home目錄下的devtools全局設(shè)置屬性(~/.spring-boot-devtools.properties,如果devtools激活)。
測試用例上的@TestPropertySource注解。
測試用例上的@SpringBootTest#properties注解。
命令行參數(shù).
來自SPRING_APPLICATION_JSON的屬性(環(huán)境變量或系統(tǒng)屬性中內(nèi)嵌的內(nèi)聯(lián)JSON)。
ServletConfig初始化參數(shù)。
ServletContext初始化參數(shù)。
來自于java:comp/env的JNDI屬性。
Java系統(tǒng)屬性(System.getProperties())。
操作系統(tǒng)環(huán)境變量。
RandomValuePropertySource,只包含random.*中的屬性。
沒有打進(jìn)jar包的Profile-specific應(yīng)用屬性(application-{profile}.properties和YAML變量)。
打進(jìn)jar包中的Profile-specific應(yīng)用屬性(application-{profile}.properties和YAML變量)。
沒有打進(jìn)jar包的應(yīng)用配置(application.properties和YAML變量)。
打進(jìn)jar包中的應(yīng)用配置(application.properties和YAML變量)。
@Configuration類上的@PropertySource注解。
默認(rèn)屬性(使用SpringApplication.setDefaultProperties指定)。
1、配置隨機(jī)值
SpringBoot支持在系統(tǒng)加載時配置生成隨機(jī)數(shù),比如生成密鑰或用于測試時,是非常有用的。
(1)在src/main/resources/config/新建random.properties文件,添加內(nèi)容如下:
#隨機(jī)32位MD5字符串
user.random.secret=${random.value}
#隨機(jī)int數(shù)字
user.random.intNumber=${random.int}
#隨機(jī)long數(shù)字
user.random.longNumber=${random.long}
#隨便uuid
user.random.uuid=${random.uuid}
#隨機(jī)10以內(nèi)的數(shù)字
user.random.lessTen=${random.int(10)}
#隨機(jī)1024~65536之內(nèi)的數(shù)字
user.random.range=${random.int[1024,65536]}
(2)新建配置綁定類
springboot/src/main/java/com/xcbeyond/springboot/config/RandomConfig.java
package com.xcbeyond.springboot.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
/**
* 隨機(jī)數(shù)配置類
* @author xcbeyond
* 2018年7月11日下午3:04:12
*/
@Component
//綁定屬性文件中的屬性,prefix:屬性前綴
@ConfigurationProperties(prefix="user.random")
//加載指定的屬性配置文件,獲取對應(yīng)的key-value值,存儲到Spring的Environment中
@PropertySource(value="config/random.properties")
public class RandomConfig {
private String secret;
private int intNumber;
private int lessTen;
private int range;
private long longNumber;
private String uuid;
public String getSecret() {
return secret;
}
public void setSecret(String secret) {
this.secret = secret;
}
public int getIntNumber() {
return intNumber;
}
public void setIntNumber(int intNumber) {
this.intNumber = intNumber;
}
public int getLessTen() {
return lessTen;
}
public void setLessTen(int lessTen) {
this.lessTen = lessTen;
}
public int getRange() {
return range;
}
public void setRange(int range) {
this.range = range;
}
public long getLongNumber() {
return longNumber;
}
public void setLongNumber(long longNumber) {
this.longNumber = longNumber;
}
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
}
(3)在control中添加測試方法,進(jìn)行驗證。
springboot/src/main/java/com/xcbeyond/springboot/controller/ControllerDemo.java
/**
* 隨機(jī)32位MD5字符串
* @return
*/
@RequestMapping("/randomSecret")
public String randomSecret() {
return randomConfig.getSecret();
}
訪問http://localhost:8888/randomSecret,顯示如下:
51b9dfe08dccf728abdcc4f971a0bffe
2、application.properties文件
SpringApplication將從以下目錄順序加載application.properties文件,并把它們添加到Spring 環(huán)境中:
當(dāng)前目錄下的/config子目錄。
當(dāng)前目錄。
classpath下的/config包。
classpath根路徑(root)。
注: 你可以使用‘*.yml’文件替代’*.properties’。
如果不喜歡使用默認(rèn)application.properties作為配置文件名,則可以自定義properties配置文件名,在SpringApplication中加載該配置文件。
3、Profile-specific屬性
除了application.properties文件,profile-specific屬性也能通過命名慣例application-{profile}.properties定義。Environment(Spring的環(huán)境抽象接口)有個默認(rèn)profiles集合(默認(rèn)情況為[default]),在沒有設(shè)置激活的profiles時會被使用(例如,如果沒有明確指定激活的profiles,application-default.properties中的屬性會被加載)。
Profile-specific屬性加載路徑和標(biāo)準(zhǔn)的application.properties相同,并且profile-specific文件總是會覆蓋non-specific文件,不管profile-specific文件是否被打包到j(luò)ar中。
如果定義多個profiles,最后一個將獲勝。例如,spring.profiles.active定義的profiles被添加到通過SpringApplicationAPI定義的profiles后面,因此優(yōu)先級更高。
注: 如果你已經(jīng)在spring.config.location下定義所有文件(非目錄),那些profile-specific的文件將不被考慮。如果想使用profile-specific屬性,那就在spring.config.location下使用目錄。
4、屬性占位符
當(dāng)使用application.properties配置文件定義的屬性時,Spring會先通過已經(jīng)存在的環(huán)境變量中查找該屬性,所以你可以使用屬性占位符" ${}"引用已定義的值(比如,系統(tǒng)屬性):
user.random.secret=${random.value}
5、使用YAML代替Properties
yaml,它是一種直觀的能夠被電腦識別的數(shù)據(jù)序列化格式,也是一種方便的定義層次配置數(shù)據(jù)的格式。
在Eclipse中通過Spring插件可直接完成properties轉(zhuǎn)化為yaml,轉(zhuǎn)化結(jié)果如下:
(在application.properties文件右鍵 Convert .properties to .yaml進(jìn)行轉(zhuǎn)化)
druid:
driver-class: com.mysql.jdbc.Driver
initial-size: 1
max-active: 20
min-idle: 1
password: 123456
test-on-borrow: true
url: jdbc:mysql://192.168.0.20:3306/test
username: root
server:
port: 8888