[翻譯]Spring Boot 特征參考2——外部配置:上

本文翻譯自:http://docs.spring.io/spring-boot/docs/2.0.0.M2/reference/htmlsingle/

詳細(xì)介紹Spring boot的關(guān)鍵特征阔拳,針對(duì)有一定springboot基礎(chǔ)的同學(xué)。

目錄

  • 1 外部配置
    • 1.1 配置隨機(jī)值
    • 1.2 訪問命令行屬性
    • 1.3 應(yīng)用程式屬性檔案
    • 1.4 配置文件特定的屬性
    • 1.5 properties中的占位符
    • 1.6 使用YAML而不是properties
      • 1.6.1 加載YAML
      • 1.6.2 將YAML作為Spring環(huán)境中的屬性
      • 1.6.3 多個(gè)YAML文件
      • 1.6.4 YAML的缺點(diǎn)
      • 1.6.5 合并YAML列表

1. 外部配置

Spring Boot允許您外部化配置么伯,以便在不同的環(huán)境中使用相同的應(yīng)用程序代碼套才。您可以使用屬性文件椅野,YAML文件,環(huán)境變量和命令行參數(shù)來(lái)外部化配置∫媛ィ可以使用@Value注釋將屬性值直接注入到您的bean中假栓,通過(guò)Spring的Environment抽象訪問或通過(guò)@ConfigurationProperties綁定到結(jié)構(gòu)化對(duì)象寻行。

Spring Boot使用非常特殊的PropertySource命令,旨在允許明智地覆蓋值匾荆。屬性按以下順序考慮:

    1. Devtools全局設(shè)置屬性在您的主目錄(~/.spring-boot-devtools.properties當(dāng)devtools是活動(dòng)的)拌蜘。
    1. @TestPropertySource注釋在你的單元測(cè)試中。
    1. @SpringBootTest #properties 注解屬性在你的單元測(cè)試中牙丽。
    1. 命令行參數(shù)简卧。
    1. 來(lái)自SPRING_APPLICATION_JSON的屬性(嵌入在環(huán)境變量或系統(tǒng)屬性中的內(nèi)嵌JSON)
    1. *ServletConfig *init參數(shù)。
    1. *ServletContext *init參數(shù)烤芦。
    1. 來(lái)自java的JNDI屬性:java:comp/env举娩。
    1. Java系統(tǒng)屬性(System.getProperties())。
    1. OS環(huán)境變量。
    1. 一個(gè)RandomValuePropertySource铜涉,只有隨機(jī)的屬性智玻。
    1. 特定于應(yīng)用程序的應(yīng)用程序?qū)傩栽诖虬膉ar之外(application- {profile} .properties和YAML變量)。
    1. 封裝在jar中的配置文件特定的應(yīng)用程序?qū)傩裕?em>application- {profile} .properties和YAML變量)芙代。
    1. 您的打包的jar(application.properties和YAML變量)之外的應(yīng)用程序?qū)傩浴?/li>
    1. 應(yīng)用程序?qū)傩源虬谀愕膉ar中 (application.properties和YAML變量)吊奢。
    1. @PropertySource注釋在您的@Configuration類。
    1. 默認(rèn)屬性(使用SpringApplication.setDefaultProperties指定)纹烹。

要提供一個(gè)具體的例子页滚,假設(shè)你開發(fā)一個(gè)使用name屬性的@Component

import org.springframework.stereotype.*
import org.springframework.beans.factory.annotation.*

@Component
public class MyBean {

    @Value("${name}")
    private String name;

    // ...

}

在您的應(yīng)用程序類路徑(例如,您的jar中)中滔韵,您可以擁有一個(gè)application.properties逻谦,它為name提供了明智的默認(rèn)屬性值。在新的環(huán)境中運(yùn)行時(shí),可以在您的jar之外提供一個(gè)application.properties來(lái)覆蓋該name;對(duì)于一次性測(cè)試,您可以使用特定的命令行開關(guān)啟動(dòng)(例如脑溢,java -jar app.jar --name =“Spring”)。

注意:
SPRING_APPLICATION_JSON屬性可以在命令行中提供一個(gè)環(huán)境變量滋将。例如在UN * X shell中:

$ SPRING_APPLICATION_JSON ='{“foo”:{“bar”:“spam”}}'java -jar myapp.jar

在這個(gè)例子中,你將在springEnvironment中以foo.bar=spam結(jié)尾症昏。您還可以在系統(tǒng)變量中將JSON作為spring.application.json提供:

$ java -Dspring.application.json ='{“foo”:“bar”}'-jar myapp.jar

或命令行參數(shù):

$ java - jar myapp.jar --spring.application.json ='{“foo”:“bar”}'

或作為JNDI變量java:comp / env / spring.application.json随闽。

1.1 配置隨機(jī)值

RandomValuePropertySource可用于注入隨機(jī)值(例如,進(jìn)入秘密或測(cè)試用例)肝谭。它可以產(chǎn)生整數(shù)掘宪,長(zhǎng)整數(shù),uuid或字符串攘烛,例如:

my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}

random.int* 語(yǔ)法是*OPEN value (,max) CLOSE
*魏滚,其中OPEN,CLOSE是任何字符和值坟漱,max是整數(shù)鼠次。如果提供max,則值為最小值芋齿,max為最大值(僅包含)腥寇。

1.2 訪問命令行屬性

默認(rèn)情況下,SpringApplication將任何命令行選項(xiàng)參數(shù)(以' - '開頭觅捆,例如--server.port = 9000)轉(zhuǎn)換為property赦役,并將其添加到Spring的Environment中。

如上所述栅炒,命令行屬性始終優(yōu)先于其他屬性源扩劝。如果不希望將命令行屬性添加到Environment中庸论,可以使用SpringApplication.setAddCommandLineProperties(false)禁用它們职辅。

1.3 應(yīng)用程式屬性檔案

SpringApplication將從以下位置的application.properties文件中加載屬性棒呛,并將它們添加到當(dāng)前目錄的Spring Environment

    1. 一個(gè)/ config子目錄中。
    1. 當(dāng)前目錄
    1. 一個(gè) classpath /config 保中
    1. 類路徑根

列表按優(yōu)先級(jí)排序(在列表中定義的屬性中定義的屬性將覆蓋在較低位置中定義的位置)域携。

注意:您也可以使用YAML('.yml')文件替代“.properties”簇秒。

如果您不喜歡application.properties作為配置文件名,可以通過(guò)指定一個(gè)spring.config.name環(huán)境屬性來(lái)切換到另一個(gè)秀鞭。您還可以使用spring.config.location環(huán)境屬性(目錄位置的逗號(hào)分隔列表或文件路徑)引用顯式位置趋观。

 $ java -jar myproject.jar --spring.config.name = myproject

$ java -jar myproject.jar --spring.config.location = classpath:/default.properties,classpath:/override.properties 

注意:spring.config.namespring.config.location非常早地用于確定哪些文件必須被加載,因此必須將其定義為環(huán)境屬性(通常是OS env锋边,system屬性或命令行參數(shù))皱坛。

如果spring.config.location包含目錄(而不是文件),它們應(yīng)該以/結(jié)束(并將在加載之前附加從spring.config.name生成的名稱豆巨,包括特定于文件的文件名)剩辟。在spring.config.location中指定的文件按原樣使用,沒有支持特定于配置文件的變量往扔,并且將被任何特定于配置文件的屬性覆蓋贩猎。

默認(rèn)的搜索路徑classpath:,classpath:/ config,file:,file:config /始終被使用,不管spring.config.location的值如何萍膛。 此搜索路徑從最低優(yōu)先級(jí)排序(file:config / 最高優(yōu)先級(jí))吭服。

如果您指定自己的位置,則它們優(yōu)先于所有默認(rèn)位置蝗罗,并使用相同的最低到最高優(yōu)先級(jí)排序艇棕。 這樣,您可以在application.properties(或使用spring.config.name選擇的其他基礎(chǔ)名稱)中為應(yīng)用程序設(shè)置默認(rèn)值串塑,并在運(yùn)行時(shí)使用不同的文件覆蓋它沼琉,并保留默認(rèn)值。

注意:如果使用環(huán)境變量而不是系統(tǒng)屬性拟赊,則大多數(shù)操作系統(tǒng)不允許使用周期分隔的鍵名稱刺桃,但可以使用下劃線(例如SPRING_CONFIG_NAME,而不是spring.config.name)吸祟。

注意:如果你在一個(gè)容器中運(yùn)行JNDI屬性(在java:comp / env)或者servlet 可以使用上下文初始化參數(shù)來(lái)代替環(huán)境變量或系統(tǒng)屬性瑟慈。

1.4 配置文件特定的屬性

除了application.properties文件之外,還可以使用命名約定application- {profile} .properties定義特定于配置文件的屬性屋匕。Environment具有默認(rèn)配置文件(默認(rèn)為[default])葛碧,如果沒有設(shè)置活動(dòng)配置文件(即,如果沒有顯式激活配置文件过吻,則加載了來(lái)自application-default.properties的屬性)进泼。

配置文件特定的屬性從與標(biāo)準(zhǔn)application.properties相同的位置加載蔗衡,配置文件特定的文件始終覆蓋非特定的文件,而不管特定于配置文件的文件是否在打包的jar內(nèi)部或外部乳绕。

如果指定了幾個(gè)配置文件绞惦,則應(yīng)用最后一個(gè)優(yōu)先策略。例如洋措,由spring.profiles.active屬性指定的配置文件通過(guò)SpringApplication API配置后添加济蝉,因此優(yōu)先。

注意:如果您在spring.config.location中指定了任何文件菠发,則不會(huì)考慮這些文件的特定于配置文件的變量王滤。使用 如果還要使用特定于配置文件的屬性,請(qǐng)?jiān)?em>spring.config.location中指定目錄滓鸠。

1.5 properties中的占位符

application.properties中的值通過(guò)使用現(xiàn)有Environment進(jìn)行過(guò)濾雁乡,以便您可以參考以前定義的值(例如,從系統(tǒng)屬性)糜俗。

app.name = MyApp 
app.description = $ {app.name} is a Spring Boot application

您還可以使用此技術(shù)創(chuàng)建現(xiàn)有Spring Boot屬性的“簡(jiǎn)短”變體踱稍。

1.6 使用YAML而不是properties

YAML是JSON的超集,因此這是一種用于指定分層配置數(shù)據(jù)的非常方便的格式吩跋。只要您的類路徑中有SnakeYAML庫(kù)寞射,SpringApplication類將自動(dòng)支持YAML作為屬性的替代方法。

注意:如果您使用“Starters”锌钮,SnakeYAML將通過(guò)spring-boot-starter自動(dòng)提供桥温。

1.6.1 加載YAML

Spring Framework提供了兩個(gè)可用于加載YAML文檔的方便類。 YamlPropertiesFactoryBean將加載YAML作為Properties梁丘,并且YamlMapFactoryBean將加載YAML作為Map侵浸。例如,以下YAML文檔:

environments:
    dev:
        url: http://dev.bar.com
        name: Developer Setup
    prod:
        url: http://foo.bar.com
        name: My Cool App

將被轉(zhuǎn)換成這些屬性:

environments.dev.url=http://dev.bar.com
environments.dev.name=Developer Setup
environments.prod.url=http://foo.bar.com
environments.prod.name=My Cool App

YAML列表表示為具有[index]取消引用的屬性鍵氛谜,例如YAML:

my:
   servers:
       - dev.bar.com
       - foo.bar.com

將被轉(zhuǎn)換成這些屬性:

my.servers[0]=dev.bar.com
my.servers[1]=foo.bar.com

要使用Spring DataBinder實(shí)用程序(這是@ConfigurationProperties所做的)綁定到這樣的屬性掏觉,您需要在類型為java.util.List(或Set)的目標(biāo)bean中具有一個(gè)屬性,并且您需要提供一個(gè)setter值漫,或者用可變值初始化它澳腹,例如這將綁定到上面的屬性

@ConfigurationProperties(prefix="my")
public class Config {

    private List<String> servers = new ArrayList<String>();

    public List<String> getServers() {
        return this.servers;
    }
}

注意:

配置列表時(shí),需要特別小心杨何,因?yàn)楦采w方式將無(wú)法正常工作酱塔。在上面的例子中,當(dāng)我的幾個(gè)地方重新定義my.servers時(shí)危虱,單個(gè)元素的目標(biāo)是覆蓋羊娃,而不是列表。要確保具有較高優(yōu)先級(jí)的PropertySource可以覆蓋列表埃跷,您需要將其定義為單個(gè)屬性:

my:
   servers: dev.bar.com,foo.bar.com
1.6.2 將YAML作為Spring環(huán)境中的屬性

可以使用YamlPropertySourceLoader類在SpringEnvironment中將YAML作為PropertySource進(jìn)行公開蕊玷。這允許您使用熟悉的@Value注釋和占位符語(yǔ)法來(lái)訪問YAML屬性邮利。

1.6.3 多個(gè)YAML文件

您可以使用spring.profiles鍵指定單個(gè)文件中的多個(gè)配置文件特定的YAML文檔,以指示文檔何時(shí)應(yīng)用垃帅。例如:

server:
    address: 192.168.1.100
---
spring:
    profiles: development
server:
    address: 127.0.0.1
---
spring:
    profiles: production
server:
    address: 192.168.1.120

在上面的示例中延届,如果development配置文件處于活動(dòng)狀態(tài),則server.address屬性將為127.0.0.1挺智。如果developmentproduction配置文件未啟用祷愉,則該屬性的值將為192.168.1.100。

如果應(yīng)用程序上下文啟動(dòng)時(shí)沒有顯式激活赦颇,默認(rèn)配置文件將被激活。所以在這個(gè)YAML中赴涵,我們?yōu)?em>security.user.password設(shè)置一個(gè)僅在“默認(rèn)”配置文件中可用的值:

server:
  port: 8000
---
spring:
  profiles: default
security:
  user:
    password: weak

而在此示例中媒怯,由于密碼未附加到任何配置文件,因此始終設(shè)置密碼髓窜,必要時(shí)必須在所有其他配置文件中顯式重置密碼:

server:
  port: 8000
security:
  user:
    password: weak

使用“spring.profiles”元素指定的彈簧輪廓可以選擇使用扇苞!字符。如果為單個(gè)文檔指定了否定和非否定的配置文件寄纵,則至少有一個(gè)非否定配置文件必須匹配鳖敷,沒有否定配置文件可能匹配。

1.6.4 YAML的缺點(diǎn)

不能通過(guò)@PropertySource注釋來(lái)加載YAML文件程拭。因此定踱,在需要以這種方式加載值的情況下,需要使用屬性文件恃鞋。

1.6.5 合并YAML列表

如上所述崖媚,任何YAML內(nèi)容最終都轉(zhuǎn)化為屬性。當(dāng)通過(guò)配置文件覆蓋“列表”屬性時(shí)恤浪,該過(guò)程可能是直觀的畅哑。

例如,假設(shè)默認(rèn)情況下水由,namedescription屬性為nullMyPojo對(duì)象荠呐。讓我們從FooProperties中公開MyPojo的列表:

@ConfigurationProperties("foo")
public class FooProperties {

    private final List<MyPojo> list = new ArrayList<>();

    public List<MyPojo> getList() {
        return this.list;
    }

}

請(qǐng)考慮以下配置:

foo:
  list:
    - name: my name
      description: my description
---
spring:
  profiles: dev
foo:
  list:
    - name: my another name

如果dev配置文件不活動(dòng),FooProperties.list將包含一個(gè)如上定義的MyPojo條目砂客。如果啟用了dev配置文件泥张,list仍將只包含一個(gè)條目(名稱為“我的另一個(gè)名稱”,描述為null)鞭盟。此配置不會(huì)將第二個(gè)MyPojo實(shí)例添加到列表中圾结,它不會(huì)合并項(xiàng)。

foo:
  list:
    - name: my name
      description: my description
    - name: another name
      description: another description
---
spring:
  profiles: dev
foo:
  list:
     - name: my another name

在上面的示例中齿诉,考慮到dev配置文件處于活動(dòng)狀態(tài)筝野,FooProperties.list將包含一個(gè)MyPojo實(shí)體(包含名稱為“my another 描述為null)晌姚。

當(dāng)在多個(gè)配置文件中指定集合時(shí),將使用具有最高優(yōu)先級(jí)的集合(并且僅使用該集合):

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末歇竟,一起剝皮案震驚了整個(gè)濱河市挥唠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌焕议,老刑警劉巖宝磨,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異盅安,居然都是意外死亡唤锉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門别瞭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)窿祥,“玉大人,你說(shuō)我怎么就攤上這事蝙寨∩柜茫” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵墙歪,是天一觀的道長(zhǎng)听系。 經(jīng)常有香客問我,道長(zhǎng)虹菲,這世上最難降的妖魔是什么靠胜? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮届惋,結(jié)果婚禮上髓帽,老公的妹妹穿的比我還像新娘。我一直安慰自己脑豹,他們只是感情好郑藏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瘩欺,像睡著了一般必盖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上俱饿,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天歌粥,我揣著相機(jī)與錄音,去河邊找鬼拍埠。 笑死失驶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的枣购。 我是一名探鬼主播嬉探,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼擦耀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了涩堤?” 一聲冷哼從身側(cè)響起眷蜓,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胎围,沒想到半個(gè)月后吁系,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡白魂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年汽纤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碧聪。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡冒版,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逞姿,到底是詐尸還是另有隱情,我是刑警寧澤捆等,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布滞造,位于F島的核電站,受9級(jí)特大地震影響栋烤,放射性物質(zhì)發(fā)生泄漏谒养。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一明郭、第九天 我趴在偏房一處隱蔽的房頂上張望买窟。 院中可真熱鬧,春花似錦薯定、人聲如沸始绍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)亏推。三九已至,卻和暖如春年堆,著一層夾襖步出監(jiān)牢的瞬間吞杭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工变丧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留芽狗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓痒蓬,卻偏偏與公主長(zhǎng)得像童擎,于是被迫代替她去往敵國(guó)和親滴劲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容