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